From 7cad0e52c5a020bd29635e9912fd8946a6b48124 Mon Sep 17 00:00:00 2001 From: Alan Alpert Date: Tue, 15 Jan 2013 14:26:59 -0800 Subject: Move the model classes from QtQuick to QtQml This is needed for proper support of non-GUI instantiators in QtQml. Only private C++ classes are affected. Aside from name changes, model classes now operate on QObjects instead of QQuickItems, leading to minor changes in the implementation of QtQuick classes using them. The old QML type names will still be registered in the QtQuick import for the forseeable future, but pointing to the new classes. The new QML types will be added in a second commit. Classes Affected: QQuickVisualDataGroup -> QQmlDataGroup QQuickVisualDataModel -> QQmlDelegateModel QQuickVisualItemModel -> QQmlObjectModel QQuickVisualModel -> QQmlInstanceModel QQuickChangeSet -> QQmlChangeSet QQuickListAccessor -> QQmlListAccessor QQuickListCompositor -> QQmlListCompositor QQuickPackage -> QQuickPackage (just moved for now) Change-Id: Ia19e630e53bfa9e5d459e289596cd11df1ea3930 Reviewed-by: Andrew den Exter --- tests/auto/qml/qml.pro | 4 +- tests/auto/qml/qqmlchangeset/qqmlchangeset.pro | 10 + tests/auto/qml/qqmlchangeset/tst_qqmlchangeset.cpp | 1574 ++++++++++++++++++ .../qml/qqmllistcompositor/qqmllistcompositor.pro | 10 + .../qqmllistcompositor/tst_qqmllistcompositor.cpp | 1740 ++++++++++++++++++++ tests/auto/qml/qquickchangeset/qquickchangeset.pro | 10 - .../qml/qquickchangeset/tst_qquickchangeset.cpp | 1574 ------------------ .../qquicklistcompositor/qquicklistcompositor.pro | 10 - .../tst_qquicklistcompositor.cpp | 1740 -------------------- 9 files changed, 3336 insertions(+), 3336 deletions(-) create mode 100644 tests/auto/qml/qqmlchangeset/qqmlchangeset.pro create mode 100644 tests/auto/qml/qqmlchangeset/tst_qqmlchangeset.cpp create mode 100644 tests/auto/qml/qqmllistcompositor/qqmllistcompositor.pro create mode 100644 tests/auto/qml/qqmllistcompositor/tst_qqmllistcompositor.cpp delete mode 100644 tests/auto/qml/qquickchangeset/qquickchangeset.pro delete mode 100644 tests/auto/qml/qquickchangeset/tst_qquickchangeset.cpp delete mode 100644 tests/auto/qml/qquicklistcompositor/qquicklistcompositor.pro delete mode 100644 tests/auto/qml/qquicklistcompositor/tst_qquicklistcompositor.cpp (limited to 'tests/auto/qml') diff --git a/tests/auto/qml/qml.pro b/tests/auto/qml/qml.pro index 5d62b91094..da705cefdb 100644 --- a/tests/auto/qml/qml.pro +++ b/tests/auto/qml/qml.pro @@ -42,9 +42,9 @@ PRIVATETESTS += \ qqmlvaluetypes \ qqmlvaluetypeproviders \ qqmlbinding \ - qquickchangeset \ + qqmlchangeset \ qqmlconnections \ - qquicklistcompositor \ + qqmllistcompositor \ qqmllistmodel \ qqmllistmodelworkerscript \ qquickworkerscript \ diff --git a/tests/auto/qml/qqmlchangeset/qqmlchangeset.pro b/tests/auto/qml/qqmlchangeset/qqmlchangeset.pro new file mode 100644 index 0000000000..b65e58c0b3 --- /dev/null +++ b/tests/auto/qml/qqmlchangeset/qqmlchangeset.pro @@ -0,0 +1,10 @@ +CONFIG += testcase +TARGET = tst_qqmlhangeset +macx:CONFIG -= app_bundle + +SOURCES += tst_qqmlchangeset.cpp + +CONFIG += parallel_test + +QT += core-private gui-private qml-private testlib +DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/qml/qqmlchangeset/tst_qqmlchangeset.cpp b/tests/auto/qml/qqmlchangeset/tst_qqmlchangeset.cpp new file mode 100644 index 0000000000..0f09de26d3 --- /dev/null +++ b/tests/auto/qml/qqmlchangeset/tst_qqmlchangeset.cpp @@ -0,0 +1,1574 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include + +class tst_qqmlchangeset : public QObject +{ + Q_OBJECT +private slots: + void sequence_data(); + void sequence(); + + void apply_data(); + void apply(); + + void removeConsecutive_data(); + void removeConsecutive(); + void insertConsecutive_data(); + void insertConsecutive(); + + void copy(); + void debug(); + + // These create random sequences and verify a list with the reordered changes applied is the + // same as one with the unordered changes applied. +private: + void random_data(); + void random(); + +public: + enum { + MoveOp = 0, + InsertOp = -1, + RemoveOp = -2 + }; + + struct Signal + { + int index; + int count; + int to; + int moveId; + int offset; + + bool isInsert() const { return to == -1; } + bool isRemove() const { return to == -2; } + bool isChange() const { return to == -3; } + bool isMove() const { return to >= 0; } + }; + + static Signal Insert(int index, int count) { + Signal signal = { index, count, -1, -1, 0 }; return signal; } + static Signal Insert(int index, int count, int moveId, int moveOffset) { + Signal signal = { index, count, -1, moveId, moveOffset }; return signal; } + static Signal Remove(int index, int count) { + Signal signal = { index, count, -2, -1, 0 }; return signal; } + static Signal Remove(int index, int count, int moveId, int moveOffset) { + Signal signal = { index, count, -2, moveId, moveOffset }; return signal; } + static Signal Move(int from, int to, int count, int moveId) { + Signal signal = { from, count, to, moveId, 0 }; return signal; } + static Signal Change(int index, int count) { + Signal signal = { index, count, -3, -1, 0 }; return signal; } + + typedef QVector SignalList; + typedef QVector SignalListList; + + template + void move(int from, int to, int n, T *items) + { + if (from > to) { + // Only move forwards - flip if backwards moving + int tfrom = from; + int tto = to; + from = tto; + to = tto+n; + n = tfrom-tto; + } + + T replaced; + int i=0; + typename T::ConstIterator it=items->begin(); it += from+n; + for (; ibegin(); it += from; + for (; ibegin(); t += from; + for (; f != replaced.end(); ++f, ++t) + *t = *f; + } + + bool applyChanges(QVector &list, const QVector > &changes) + { + foreach (const SignalList &sl, changes) { + if (!applyChanges(list, sl)) + return false; + } + return true; + } + + bool applyChanges(QVector &list, const QVector &changes) + { + QHash removedValues; + foreach (const Signal &signal, changes) { + if (signal.isInsert()) { + if (signal.index < 0 || signal.index > list.count()) { + qDebug() << "insert out of range" << signal.index << list.count(); + return false; + } + if (signal.moveId != -1) { + QQmlChangeSet::Insert insert(signal.index, signal.count, signal.moveId, signal.offset); + for (int i = insert.start(); i < insert.end(); ++i) + list.insert(i, removedValues.take(insert.moveKey(i))); + } else { + list.insert(signal.index, signal.count, 100); + } + } else if (signal.isRemove()) { + if (signal.index < 0 || signal.index + signal.count > list.count()) { + qDebug() << "remove out of range" << signal.index << signal.count << list.count(); + return false; + } + if (signal.moveId != -1) { + QQmlChangeSet::Remove remove(signal.index, signal.count, signal.moveId, signal.offset); + for (int i = remove.start(); i < remove.end(); ++i) + removedValues.insert(remove.moveKey(i), list.at(i)); + } + list.erase(list.begin() + signal.index, list.begin() + signal.index + signal.count); + } else if (signal.isMove()) { + if (signal.index < 0 + || signal.to < 0 + || signal.index + signal.count > list.count() + || signal.to + signal.count > list.count()) { + qDebug() << "move out of range" << signal.index << signal.to << signal.count << list.count(); + return false; + } + move(signal.index, signal.to, signal.count, &list); + } else if (signal.isChange()) { + for (int i = signal.index; i < signal.index + signal.count; ++i) + list[i] = 100; + } + } + return true; + } + +}; + +bool operator ==(const tst_qqmlchangeset::Signal &left, const tst_qqmlchangeset::Signal &right) +{ + return left.index == right.index + && left.count == right.count + && left.to == right.to + && left.moveId == right.moveId + && (left.moveId == -1 || left.offset == right.offset); +} + +QT_BEGIN_NAMESPACE +bool operator ==(const QQmlChangeSet::Change &left, const QQmlChangeSet::Change &right) +{ + return left.index == right.index && left.count == right.count && left.moveId == right.moveId; +} +QT_END_NAMESPACE + +QDebug operator <<(QDebug debug, const tst_qqmlchangeset::Signal &signal) +{ + if (signal.isInsert() && signal.moveId == -1) + debug.nospace() << "Insert(" << signal.index << "," << signal.count << ")"; + else if (signal.isInsert()) + debug.nospace() << "Insert(" << signal.index << "," << signal.count << "," << signal.moveId << "," << signal.offset << ")"; + else if (signal.isRemove() && signal.moveId == -1) + debug.nospace() << "Remove(" << signal.index << "," << signal.count << ")"; + else if (signal.isRemove()) + debug.nospace() << "Remove(" << signal.index << "," << signal.count << "," << signal.moveId << "," << signal.offset << ")"; + else if (signal.isMove()) + debug.nospace() << "Move(" << signal.index << "," << signal.to << "," << signal.count << "," << signal.moveId << ")"; + else if (signal.isChange()) + debug.nospace() << "Change(" << signal.index << "," << signal.count << ")"; + return debug; +} + +Q_DECLARE_METATYPE(tst_qqmlchangeset::SignalList) +Q_DECLARE_METATYPE(tst_qqmlchangeset::SignalListList) + +#if 0 +# define VERIFY_EXPECTED_OUTPUT \ + QVector inputList; \ + for (int i = 0; i < 40; ++i) \ + inputList.append(i); \ + QVector outputList = inputList; \ + if (!applyChanges(inputList, input)) { \ + qDebug() << input; \ + qDebug() << output; \ + qDebug() << changes; \ + QVERIFY(false); \ + } else if (!applyChanges(outputList, output)) { \ + qDebug() << input; \ + qDebug() << output; \ + qDebug() << changes; \ + QVERIFY(false); \ + } else if (outputList != inputList /* || changes != output*/) { \ + qDebug() << input; \ + qDebug() << output; \ + qDebug() << changes; \ + qDebug() << inputList; \ + qDebug() << outputList; \ + QVERIFY(false); \ + } else if (changes != output) { \ + qDebug() << output; \ + qDebug() << changes; \ + QCOMPARE(outputList, inputList); \ + } +#else +# define VERIFY_EXPECTED_OUTPUT \ + if (changes != output) { \ + qDebug() << output; \ + qDebug() << changes; \ + } +#endif + +void tst_qqmlchangeset::sequence_data() +{ + QTest::addColumn("input"); + QTest::addColumn("output"); + + // Insert + QTest::newRow("i(12,5)") + << (SignalList() << Insert(12,5)) + << (SignalList() << Insert(12,5)); + QTest::newRow("i(2,3),i(12,5)") + << (SignalList() << Insert(2,3) << Insert(12,5)) + << (SignalList() << Insert(2,3) << Insert(12,5)); + QTest::newRow("i(12,5),i(2,3)") + << (SignalList() << Insert(12,5) << Insert(2,3)) + << (SignalList() << Insert(2,3) << Insert(15,5)); + QTest::newRow("i(12,5),i(12,3)") + << (SignalList() << Insert(12,5) << Insert(12,3)) + << (SignalList() << Insert(12,8)); + QTest::newRow("i(12,5),i(17,3)") + << (SignalList() << Insert(12,5) << Insert(17,3)) + << (SignalList() << Insert(12,8)); + QTest::newRow("i(12,5),i(15,3)") + << (SignalList() << Insert(12,5) << Insert(15,3)) + << (SignalList() << Insert(12,8)); + + // Remove + QTest::newRow("r(3,9)") + << (SignalList() << Remove(3,9)) + << (SignalList() << Remove(3,9)); + QTest::newRow("r(3,4),r(3,2)") + << (SignalList() << Remove(3,4) << Remove(3,2)) + << (SignalList() << Remove(3,6)); + QTest::newRow("r(4,3),r(14,5)") + << (SignalList() << Remove(4,3) << Remove(14,5)) + << (SignalList() << Remove(4,3) << Remove(14,5)); + QTest::newRow("r(14,5),r(4,3)") + << (SignalList() << Remove(14,5) << Remove(4,3)) + << (SignalList() << Remove(4,3) << Remove(11,5)); + QTest::newRow("r(4,3),r(2,9)") + << (SignalList() << Remove(4,3) << Remove(2,9)) + << (SignalList() << Remove(2,12)); + + // Move + QTest::newRow("m(8-10,2)") + << (SignalList() << Move(8,10,2,0)) + << (SignalList() << Remove(8,2,0,0) << Insert(10,2,0,0)); + + QTest::newRow("m(23-12,6),m(13-15,5)") + << (SignalList() << Move(23,12,6,0) << Move(13,15,5,1)) + << (SignalList() << Remove(23,6,0,0) << Insert(12,1,0,0) << Insert(15,5,0,1)); + QTest::newRow("m(23-12,6),m(13-15,2)") + << (SignalList() << Move(23,12,6,0) << Move(13,20,2,1)) + << (SignalList() << Remove(23,6,0,0) << Insert(12,1,0,0) << Insert(13,3,0,3) << Insert(20,2,0,1)); + QTest::newRow("m(23-12,6),m(13-2,2)") + << (SignalList() << Move(23,12,6,0) << Move(13,2,2,1)) + << (SignalList() << Remove(23,6,0,0) << Insert(2,2,0,1) << Insert(14,1,0,0) << Insert(15,3,0,3)); + QTest::newRow("m(23-12,6),m(12-6,5)") + << (SignalList() << Move(23,12,6,0) << Move(12,6,5,1)) + << (SignalList() << Remove(23,6,0,0) << Insert(6,5,0,0) << Insert(17,1,0,5)); + QTest::newRow("m(23-12,6),m(10-5,4)") + << (SignalList() << Move(23,12,6,0) << Move(10,5,4,1)) + << (SignalList() << Remove(10,2,1,0) << Remove(21,6,0,0) << Insert(5,2,1,0) << Insert(7,2,0,0) << Insert(14,4,0,2)); + QTest::newRow("m(23-12,6),m(16-5,4)") + << (SignalList() << Move(23,12,6,0) << Move(16,5,4,1)) + << (SignalList() << Remove(12,2,1,2) << Remove(21,6,0,0) << Insert(5,2,0,4) << Insert(7,2,1,2) << Insert(16,4,0,0)); + QTest::newRow("m(23-12,6),m(13-5,4)") + << (SignalList() << Move(23,12,6,0) << Move(13,5,4,1)) + << (SignalList() << Remove(23,6,0,0) << Insert(5,4,0,1) << Insert(16,1,0,0) << Insert(17,1,0,5)); + QTest::newRow("m(23-12,6),m(14-5,4)") + << (SignalList() << Move(23,12,6,0) << Move(14,5,4,1)) + << (SignalList() << Remove(23,6,0,0) << Insert(5,4,0,2) << Insert(16,2,0,0)); + QTest::newRow("m(23-12,6),m(12-5,4)") + << (SignalList() << Move(23,12,6,0) << Move(12,5,4,1)) + << (SignalList() << Remove(23,6,0,0) << Insert(5,4,0,0) << Insert(16,2,0,4)); + QTest::newRow("m(23-12,6),m(11-5,8)") + << (SignalList() << Move(23,12,6,0) << Move(11,5,8,1)) + << (SignalList() << Remove(11,1,1,0) << Remove(11,1,1,7) << Remove(21,6,0,0) << Insert(5,1,1,0) << Insert(6,6,0,0) << Insert(12,1,1,7)); + QTest::newRow("m(23-12,6),m(8-5,4)") + << (SignalList() << Move(23,12,6,0) << Move(8,5,4,1)) + << (SignalList() << Remove(8,4,1,0) << Remove(19,6,0,0) << Insert(5,4,1,0) << Insert(12,6,0,0)); + QTest::newRow("m(23-12,6),m(2-5,4)") + << (SignalList() << Move(23,12,6,0) << Move(2,5,4,1)) + << (SignalList() << Remove(2,4,1,0) << Remove(19,6,0,0) << Insert(5,4,1,0) << Insert(12,6,0,0)); + QTest::newRow("m(23-12,6),m(18-5,4)") + << (SignalList() << Move(23,12,6,0) << Move(18,5,4,1)) + << (SignalList() << Remove(12,4,1,0) << Remove(19,6,0,0) << Insert(5,4,1,0) << Insert(16,6,0,0)); + QTest::newRow("m(23-12,6),m(20-5,4)") + << (SignalList() << Move(23,12,6,0) << Move(20,5,4,1)) + << (SignalList() << Remove(14,4,1,0) << Remove(19,6,0,0) << Insert(5,4,1,0) << Insert(16,6,0,0)); + + QTest::newRow("m(23-12,6),m(5-13,11)") + << (SignalList() << Move(23,12,6,0) << Move(5,13,11,1)) + << (SignalList() << Remove(5,7,1,0) << Remove(16,6,0,0) << Insert(5,2,0,4) << Insert(13,7,1,0) << Insert(20,4,0,0)); + + QTest::newRow("m(23-12,6),m(12-23,6)") + << (SignalList() << Move(23,12,6,0) << Move(12,23,6,1)) + << (SignalList() << Remove(23,6,0,0) << Insert(23,6,0,0)); // ### These cancel out. + QTest::newRow("m(23-12,6),m(10-23,4)") + << (SignalList() << Move(23,12,6,0) << Move(10,23,4,1)) + << (SignalList() << Remove(10,2,1,0) << Remove(21,6,0,0) << Insert(10,4,0,2) << Insert(23,2,1,0) << Insert(25,2,0,0)); + QTest::newRow("m(23-12,6),m(16-23.4)") + << (SignalList() << Move(23,12,6,0) << Move(16,23,4,1)) + << (SignalList() << Remove(12,2,1,2) << Remove(21,6,0,0) << Insert(12,4,0,0) << Insert(23,2,0,4) << Insert(25,2,1,2)); + QTest::newRow("m(23-12,6),m(13-23,4)") + << (SignalList() << Move(23,12,6,0) << Move(13,23,4,1)) + << (SignalList() << Remove(23,6,0,0) << Insert(12,1,0,0) << Insert(13,1,0,5) << Insert(23,4,0,1)); + QTest::newRow("m(23-12,6),m(14-23,)") + << (SignalList() << Move(23,12,6,0) << Move(14,23,4,1)) + << (SignalList() << Remove(23,6,0,0) << Insert(12,2,0,0) << Insert(23,4,0,2)); + QTest::newRow("m(23-12,6),m(12-23,4)") + << (SignalList() << Move(23,12,6,0) << Move(12,23,4,1)) + << (SignalList() << Remove(23,6,0,0) << Insert(12,2,0,4) << Insert(23,4,0,0)); + QTest::newRow("m(23-12,6),m(11-23,8)") + << (SignalList() << Move(23,12,6,0) << Move(11,23,8,1)) + << (SignalList() << Remove(11,1,1,0) << Remove(11,1,1,7) << Remove(21,6,0,0) << Insert(23,1,1,0) << Insert(24,6,0,0) << Insert(30,1,1,7)); + QTest::newRow("m(23-12,6),m(8-23,4)") + << (SignalList() << Move(23,12,6,0) << Move(8,23,4,1)) + << (SignalList() << Remove(8,4,1,0) << Remove(19,6,0,0) << Insert(8,6,0,0) << Insert(23,4,1,0)); + QTest::newRow("m(23-12,6),m(2-23,4)") + << (SignalList() << Move(23,12,6,0) << Move(2,23,4,1)) + << (SignalList() << Remove(2,4,1,0) << Remove(19,6,0,0) << Insert(8,6,0,0) << Insert(23,4,1,0)); + QTest::newRow("m(23-12,6),m(18-23,4)") + << (SignalList() << Move(23,12,6,0) << Move(18,23,4,1)) + << (SignalList() << Remove(12,4,1,0) << Remove(19,6,0,0) << Insert(12,6,0,0) << Insert(23,4,1,0)); + QTest::newRow("m(23-12,6),m(20-23,4)") + << (SignalList() << Move(23,12,6,0) << Move(20,23,4,1)) + << (SignalList() << Remove(14,4,1,0) << Remove(19,6,0,0) << Insert(12,6,0,0) << Insert(23,4,1,0)); + + QTest::newRow("m(23-12,6),m(11-23,10)") + << (SignalList() << Move(23,12,6,0) << Move(11,23,10,1)) + << (SignalList() << Remove(11,1,1,0) << Remove(11,3,1,7) << Remove(19,6,0,0) << Insert(23,1,1,0) << Insert(24,6,0,0) << Insert(30,3,1,7)); + + QTest::newRow("m(3-9,12),m(13-5,12)") + << (SignalList() << Move(3,9,12,0) << Move(13,15,5,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,4,0,0) << Insert(13,2,0,9) << Insert(15,5,0,4) << Insert(20,1,0,11)); + QTest::newRow("m(3-9,12),m(13-15,20)") + << (SignalList() << Move(3,9,12,0) << Move(13,15,20,1)) + << (SignalList() << Remove(3,12,0,0) << Remove(9,12,1,8) << Insert(9,4,0,0) << Insert(15,8,0,4) << Insert(23,12,1,8)); + QTest::newRow("m(3-9,12),m(13-15,2)") + << (SignalList() << Move(3,9,12,0) << Move(13,15,2,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,4,0,0) << Insert(13,2,0,6) << Insert(15,2,0,4) << Insert(17,4,0,8)); + QTest::newRow("m(3-9,12),m(12-5,6)") + << (SignalList() << Move(3,9,12,0) << Move(12,5,6,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(5,6,0,3) << Insert(15,3,0,0) << Insert(18,3,0,9)); + QTest::newRow("m(3-9,12),m(10-14,5)") + << (SignalList() << Move(3,9,12,0) << Move(10,14,5,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,1,0,0) << Insert(10,4,0,6) << Insert(14,5,0,1) << Insert(19,2,0,10)); + QTest::newRow("m(3-9,12),m(16-20,5)") + << (SignalList() << Move(3,9,12,0) << Move(16,20,5,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,7,0,0) << Insert(20,5,0,7)); + QTest::newRow("m(3-9,12),m(13-17,5)") + << (SignalList() << Move(3,9,12,0) << Move(13,17,5,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,4,0,0) << Insert(13,3,0,9) << Insert(17,5,0,4)); + QTest::newRow("m(3-9,12),m(14-18,5)") + << (SignalList() << Move(3,9,12,0) << Move(14,18,5,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,5,0,0) << Insert(14,2,0,10) << Insert(18,5,0,5)); + QTest::newRow("m(3-9,12),m(12-16,5)") + << (SignalList() << Move(3,9,12,0) << Move(12,16,5,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,3,0,0) << Insert(12,4,0,8) << Insert(16,5,0,3)); + QTest::newRow("m(3-9,12),m(11-19,5)") + << (SignalList() << Move(3,9,12,0) << Move(11,19,5,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,2,0,0) << Insert(11,5,0,7) << Insert(19,5,0,2)); + QTest::newRow("m(3-9,12),m(8-12,5)") + << (SignalList() << Move(3,9,12,0) << Move(8,12,5,1)) + << (SignalList() << Remove(3,12,0,0) << Remove(8,1,1,0) << Insert(8,4,0,4) << Insert(12,1,1,0) << Insert(13,4,0,0) << Insert(17,4,0,8)); + QTest::newRow("m(3-9,12),m(2-6,5)") + << (SignalList() << Move(3,9,12,0) << Move(2,6,5,1)) + << (SignalList() << Remove(2,1,1,0) << Remove(2,12,0,0) << Remove(2,4,1,1) << Insert(4,2,0,0) << Insert(6,5,1,0) << Insert(11,10,0,2)); + QTest::newRow("m(3-9,12),m(18-22,5)") + << (SignalList() << Move(3,9,12,0) << Move(18,22,5,1)) + << (SignalList() << Remove(3,12,0,0) << Remove(9,2,1,3) << Insert(9,9,0,0) << Insert(22,3,0,9) << Insert(25,2,1,3)); + QTest::newRow("m(3-9,12),m(20-24,5)") + << (SignalList() << Move(3,9,12,0) << Move(20,24,5,1)) + << (SignalList() << Remove(3,12,0,0) << Remove(9,4,1,1) << Insert(9,11,0,0) << Insert(24,1,0,11) << Insert(25,4,1,1)); + + QTest::newRow("m(3-9,12),m(5-11,8)") + << (SignalList() << Move(3,9,12,0) << Move(5,11,8,1)) + << (SignalList() << Remove(3,12,0,0) << Remove(5,4,1,0) << Insert(5,6,0,4) << Insert(11,4,1,0) << Insert(15,4,0,0) << Insert(19,2,0,10)); + + QTest::newRow("m(3-9,12),m(12-23,6)") + << (SignalList() << Move(3,9,12,0) << Move(12,23,6,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,3,0,0) << Insert(12,3,0,9) << Insert(23,6,0,3)); + QTest::newRow("m(3-9,12),m(10-23,4)") + << (SignalList() << Move(3,9,12,0) << Move(10,23,4,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,1,0,0) << Insert(10,7,0,5) << Insert(23,4,0,1)); + QTest::newRow("m(3-9,12),m(16-23,4)") + << (SignalList() << Move(3,9,12,0) << Move(16,23,4,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,7,0,0) << Insert(16,1,0,11) << Insert(23,4,0,7)); + QTest::newRow("m(3-9,12),m(13-23,4)") + << (SignalList() << Move(3,9,12,0) << Move(13,23,4,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,4,0,0) << Insert(13,4,0,8) << Insert(23,4,0,4)); + QTest::newRow("m(3-9,12),m(14-23,4)") + << (SignalList() << Move(3,9,12,0) << Move(14,23,4,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,5,0,0) << Insert(14,3,0,9) << Insert(23,4,0,5)); + QTest::newRow("m(3-9,12),m(12-23,4)") + << (SignalList() << Move(3,9,12,0) << Move(12,23,4,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,3,0,0) << Insert(12,5,0,7) << Insert(23,4,0,3)); + QTest::newRow("m(3-9,12),m(11-23,8)") + << (SignalList() << Move(3,9,12,0) << Move(11,23,8,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,2,0,0) << Insert(11,2,0,10) << Insert(23,8,0,2)); + QTest::newRow("m(3-9,12),m(8-23,4)") + << (SignalList() << Move(3,9,12,0) << Move(8,23,4,1)) + << (SignalList() << Remove(3,12,0,0) << Remove(8,1,1,0) << Insert(8,9,0,3) << Insert(23,1,1,0) << Insert(24,3,0,0)); + QTest::newRow("m(3-9,12),m(2-23,4)") + << (SignalList() << Move(3,9,12,0) << Move(2,23,4,1)) + << (SignalList() << Remove(2,1,1,0) << Remove(2,12,0,0) << Remove(2,3,1,1) << Insert(5,12,0,0) << Insert(23,4,1,0)); + QTest::newRow("m(3-9,12),m(18-23,4)") + << (SignalList() << Move(3,9,12,0) << Move(18,23,4,1)) + << (SignalList() << Remove(3,12,0,0) << Remove(9,1,1,3) << Insert(9,9,0,0) << Insert(23,3,0,9) << Insert(26,1,1,3)); + QTest::newRow("m(3-9,12),m(20-23,4)") + << (SignalList() << Move(3,9,12,0) << Move(20,23,4,1)) + << (SignalList() << Remove(3,12,0,0) << Remove(9,3,1,1) << Insert(9,11,0,0) << Insert(23,1,0,11) << Insert(24,3,1,1)); + + QTest::newRow("m(3-9,12),m(11-23,10)") + << (SignalList() << Move(3,9,12,0) << Move(11,23,10,1)) + << (SignalList() << Remove(3,12,0,0) << Insert(9,2,0,0) << Insert(23,10,0,2)); + + // Change + QTest::newRow("c(4,5)") + << (SignalList() << Change(4,5)) + << (SignalList() << Change(4,5)); + QTest::newRow("c(4,5),c(12,2)") + << (SignalList() << Change(4,5) << Change(12,2)) + << (SignalList() << Change(4,5) << Change(12,2)); + QTest::newRow("c(12,2),c(4,5)") + << (SignalList() << Change(12,2) << Change(4,5)) + << (SignalList() << Change(4,5) << Change(12,2)); + QTest::newRow("c(4,5),c(2,2)") + << (SignalList() << Change(4,5) << Change(2,2)) + << (SignalList() << Change(2,7)); + QTest::newRow("c(4,5),c(9,2)") + << (SignalList() << Change(4,5) << Change(9,2)) + << (SignalList() << Change(4,7)); + QTest::newRow("c(4,5),c(3,2)") + << (SignalList() << Change(4,5) << Change(3,2)) + << (SignalList() << Change(3,6)); + QTest::newRow("c(4,5),c(8,2)") + << (SignalList() << Change(4,5) << Change(8,2)) + << (SignalList() << Change(4,6)); + QTest::newRow("c(4,5),c(3,2)") + << (SignalList() << Change(4,5) << Change(3,2)) + << (SignalList() << Change(3,6)); + QTest::newRow("c(4,5),c(2,9)") + << (SignalList() << Change(4,5) << Change(2,9)) + << (SignalList() << Change(2,9)); + QTest::newRow("c(4,5),c(12,3),c(8,6)") + << (SignalList() << Change(4,5) << Change(12,3) << Change(8,6)) + << (SignalList() << Change(4,11)); + + // Insert,then remove. + QTest::newRow("i(12,6),r(12,6)") + << (SignalList() << Insert(12,6) << Remove(12,6)) + << (SignalList()); + QTest::newRow("i(12,6),r(10,4)") + << (SignalList() << Insert(12,6) << Remove(10,4)) + << (SignalList() << Remove(10,2) << Insert(10,4)); + QTest::newRow("i(12,6),r(16,4)") + << (SignalList() << Insert(12,6) << Remove(16,4)) + << (SignalList() << Remove(12,2) << Insert(12,4)); + QTest::newRow("i(12,6),r(13,4)") + << (SignalList() << Insert(12,6) << Remove(13,4)) + << (SignalList() << Insert(12,2)); + QTest::newRow("i(12,6),r(14,4)") + << (SignalList() << Insert(12,6) << Remove(14,4)) + << (SignalList() << Insert(12,2)); + QTest::newRow("i(12,6),r(12,4)") + << (SignalList() << Insert(12,6) << Remove(12,4)) + << (SignalList() << Insert(12,2)); + QTest::newRow("i(12,6),r(11,8)") + << (SignalList() << Insert(12,6) << Remove(11,8)) + << (SignalList() << Remove(11,2)); + QTest::newRow("i(12,6),r(8,4)") + << (SignalList() << Insert(12,6) << Remove(8,4)) + << (SignalList() << Remove(8,4) << Insert(8,6)); + QTest::newRow("i(12,6),r(2,4)") + << (SignalList() << Insert(12,6) << Remove(2,4)) + << (SignalList() << Remove(2,4) << Insert(8,6)); + QTest::newRow("i(12,6),r(18,4)") + << (SignalList() << Insert(12,6) << Remove(18,4)) + << (SignalList() << Remove(12,4) << Insert(12,6)); + QTest::newRow("i(12,6),r(20,4)") + << (SignalList() << Insert(12,6) << Remove(20,4)) + << (SignalList() << Remove(14,4) << Insert(12,6)); + + // Insert,then change + QTest::newRow("i(12,6),c(12,6)") + << (SignalList() << Insert(12,6) << Change(12,6)) + << (SignalList() << Insert(12,6)); + QTest::newRow("i(12,6),c(10,6)") + << (SignalList() << Insert(12,6) << Change(10,6)) + << (SignalList() << Insert(12,6) << Change(10,2)); + QTest::newRow("i(12,6),c(16,4)") + << (SignalList() << Insert(12,6) << Change(16,4)) + << (SignalList() << Insert(12,6) << Change(18,2)); + QTest::newRow("i(12,6),c(13,4)") + << (SignalList() << Insert(12,6) << Change(13,4)) + << (SignalList() << Insert(12,6)); + QTest::newRow("i(12,6),c(14,4)") + << (SignalList() << Insert(12,6) << Change(14,4)) + << (SignalList() << Insert(12,6)); + QTest::newRow("i(12,6),c(12,4)") + << (SignalList() << Insert(12,6) << Change(12,4)) + << (SignalList() << Insert(12,6)); + QTest::newRow("i(12,6),c(11,8)") + << (SignalList() << Insert(12,6) << Change(11,8)) + << (SignalList() << Insert(12,6) << Change(11,1) << Change(18,1)); + QTest::newRow("i(12,6),c(8,4)") + << (SignalList() << Insert(12,6) << Change(8,4)) + << (SignalList() << Insert(12,6) << Change(8,4)); + QTest::newRow("i(12,6),c(2,4)") + << (SignalList() << Insert(12,6) << Change(2,4)) + << (SignalList() << Insert(12,6) << Change(2,4)); + QTest::newRow("i(12,6),c(18,4)") + << (SignalList() << Insert(12,6) << Change(18,4)) + << (SignalList() << Insert(12,6) << Change(18,4)); + QTest::newRow("i(12,6),c(20,4)") + << (SignalList() << Insert(12,6) << Change(20,4)) + << (SignalList() << Insert(12,6) << Change(20,4)); + + // Insert,then move + QTest::newRow("i(12,6),m(12-5,6)") + << (SignalList() << Insert(12,6) << Move(12,5,6,0)) + << (SignalList() << Insert(5,6)); + QTest::newRow("i(12,6),m(10-5,4)") + << (SignalList() << Insert(12,6) << Move(10,5,4,0)) + << (SignalList() << Remove(10,2,0,0) << Insert(5,2,0,0) << Insert(7,2) << Insert(14,4)); + QTest::newRow("i(12,6),m(16-5,4)") + << (SignalList() << Insert(12,6) << Move(16,5,4,0)) + << (SignalList() << Remove(12,2,0,2) << Insert(5,2) << Insert(7,2,0,2) << Insert(16,4)); + QTest::newRow("i(12,6),m(13-5,4)") + << (SignalList() << Insert(12,6) << Move(13,5,4,0)) + << (SignalList() << Insert(5,4) << Insert(16,2)); + QTest::newRow("i(12,6),m(14-5,4)") + << (SignalList() << Insert(12,6) << Move(14,5,4,0)) + << (SignalList() << Insert(5,4) << Insert(16,2)); + QTest::newRow("i(12,6),m(12-5,4)") + << (SignalList() << Insert(12,6) << Move(12,5,4,0)) + << (SignalList() << Insert(5,4) << Insert(16,2)); + QTest::newRow("i(12,6),m(11-5,8)") + << (SignalList() << Insert(12,6) << Move(11,5,8,0)) + << (SignalList() << Remove(11,1,0,0) << Remove(11,1,0,7) << Insert(5,1,0,0) << Insert(6,6) << Insert(12,1,0,7)); + QTest::newRow("i(12,6),m(8-5,4)") + << (SignalList() << Insert(12,6) << Move(8,5,4,0)) + << (SignalList() << Remove(8,4,0,0) << Insert(5,4,0,0) << Insert(12,6)); + QTest::newRow("i(12,6),m(2-5,4)") + << (SignalList() << Insert(12,6) << Move(2,5,4,0)) + << (SignalList() << Remove(2,4,0,0) << Insert(5,4,0,0) << Insert(12,6)); + QTest::newRow("i(12,6),m(18-5,4)") + << (SignalList() << Insert(12,6) << Move(18,5,4,0)) + << (SignalList() << Remove(12,4,0,0) << Insert(5,4,0,0) << Insert(16,6)); + QTest::newRow("i(12,6),m(20-5,4)") + << (SignalList() << Insert(12,6) << Move(20,5,4,0)) + << (SignalList() << Remove(14,4,0,0) << Insert(5,4,0,0) << Insert(16,6)); + + QTest::newRow("i(12,6),m(5-13,11)") + << (SignalList() << Insert(12,6) << Move(5,11,8,0)) + << (SignalList() << Remove(5,7,0,0) << Insert(5,5) << Insert(11,7,0,0) << Insert(18,1)); + + QTest::newRow("i(12,6),m(12-23,6)") + << (SignalList() << Insert(12,6) << Move(12,23,6,0)) + << (SignalList() << Insert(23,6)); + QTest::newRow("i(12,6),m(10-23,4)") + << (SignalList() << Insert(12,6) << Move(10,23,4,0)) + << (SignalList() << Remove(10,2,0,0) << Insert(10,4) << Insert(23,2,0,0) << Insert(25,2)); + QTest::newRow("i(12,6),m(16-23,4)") + << (SignalList() << Insert(12,6) << Move(16,23,4,0)) + << (SignalList() << Remove(12,2,0,2) << Insert(12,4) << Insert(23,2) << Insert(25,2,0,2)); + QTest::newRow("i(12,6),m(13-23,4)") + << (SignalList() << Insert(12,6) << Move(13,23,4,0)) + << (SignalList() << Insert(12,2) << Insert(23,4)); + QTest::newRow("i(12,6),m(14-23,4)") + << (SignalList() << Insert(12,6) << Move(14,23,4,0)) + << (SignalList() << Insert(12,2) << Insert(23,4)); + QTest::newRow("i(12,6),m(12-23,4)") + << (SignalList() << Insert(12,6) << Move(12,23,4,0)) + << (SignalList() << Insert(12,2) << Insert(23,4)); + QTest::newRow("i(12,6),m(11-23,8)") + << (SignalList() << Insert(12,6) << Move(11,23,8,0)) + << (SignalList() << Remove(11,1,0,0) << Remove(11,1,0,7) << Insert(23,1,0,0)<< Insert(24,6) << Insert(30,1,0,7)); + QTest::newRow("i(12,6),m(8-23,4)") + << (SignalList() << Insert(12,6) << Move(8,23,4,0)) + << (SignalList() << Remove(8,4,0,0) << Insert(8,6) << Insert(23,4,0,0)); + QTest::newRow("i(12,6),m(2-23,4)") + << (SignalList() << Insert(12,6) << Move(2,23,4,0)) + << (SignalList() << Remove(2,4,0,0) << Insert(8,6) << Insert(23,4,0,0)); + QTest::newRow("i(12,6),m(18-23,4)") + << (SignalList() << Insert(12,6) << Move(18,23,4,0)) + << (SignalList() << Remove(12,4,0,0) << Insert(12,6) << Insert(23,4,0,0)); + QTest::newRow("i(12,6),m(20-23,4)") + << (SignalList() << Insert(12,6) << Move(20,23,4,0)) + << (SignalList() << Remove(14,4,0,0) << Insert(12,6) << Insert(23,4,0,0)); + + QTest::newRow("i(12,6),m(11-23,10)") + << (SignalList() << Insert(12,6) << Move(11,23,10,0)) + << (SignalList() << Remove(11,1,0,0) << Remove(11,3,0,7) << Insert(23,1,0,0) << Insert(24,6) << Insert(30,3,0,7)); + + // Remove,then insert + QTest::newRow("r(12,6),i(12,6)") + << (SignalList() << Remove(12,6) << Insert(12,6)) + << (SignalList() << Remove(12,6) << Insert(12,6)); + QTest::newRow("r(12,6),i(10,4)") + << (SignalList() << Remove(12,6) << Insert(10,14)) + << (SignalList() << Remove(12,6) << Insert(10,14)); + QTest::newRow("r(12,6),i(16,4)") + << (SignalList() << Remove(12,6) << Insert(16,4)) + << (SignalList() << Remove(12,6) << Insert(16,4)); + QTest::newRow("r(12,6),i(13,4)") + << (SignalList() << Remove(12,6) << Insert(13,4)) + << (SignalList() << Remove(12,6) << Insert(13,4)); + QTest::newRow("r(12,6),i(14,4)") + << (SignalList() << Remove(12,6) << Insert(14,4)) + << (SignalList() << Remove(12,6) << Insert(14,4)); + QTest::newRow("r(12,6),i(12,4)") + << (SignalList() << Remove(12,6) << Insert(12,4)) + << (SignalList() << Remove(12,6) << Insert(12,4)); + QTest::newRow("r(12,6),i(11,8)") + << (SignalList() << Remove(12,6) << Insert(11,8)) + << (SignalList() << Remove(12,6) << Insert(11,8)); + QTest::newRow("r(12,6),i(8,4)") + << (SignalList() << Remove(12,6) << Insert(8,4)) + << (SignalList() << Remove(12,6) << Insert(8,4)); + QTest::newRow("r(12,6),i(2,4)") + << (SignalList() << Remove(12,6) << Insert(2,4)) + << (SignalList() << Remove(12,6) << Insert(2,4)); + QTest::newRow("r(12,6),i(18,4)") + << (SignalList() << Remove(12,6) << Insert(18,4)) + << (SignalList() << Remove(12,6) << Insert(18,4)); + QTest::newRow("r(12,6),i(20,4)") + << (SignalList() << Remove(12,6) << Insert(20,4)) + << (SignalList() << Remove(12,6) << Insert(20,4)); + + // Move,then insert + QTest::newRow("m(12-5,6),i(12,6)") + << (SignalList() << Move(12,5,6,0) << Insert(12,6)) + << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(12,6)); + QTest::newRow("m(12-5,6),i(10,4)") + << (SignalList() << Move(12,5,6,0) << Insert(10,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(5,5,0,0) << Insert(10,4) << Insert(14,1,0,5)); + QTest::newRow("m(12-5,6),i(16,4)") + << (SignalList() << Move(12,5,6,0) << Insert(16,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(16,4)); + QTest::newRow("m(12-5,6),i(13,4)") + << (SignalList() << Move(12,5,6,0) << Insert(13,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(13,4)); + QTest::newRow("m(12-5,6),i(14,4)") + << (SignalList() << Move(12,5,6,0) << Insert(14,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(14,4)); + QTest::newRow("m(12-5,6),i(12,4)") + << (SignalList() << Move(12,5,6,0) << Insert(12,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(12,4)); + QTest::newRow("m(12-5,6),i(11,8)") + << (SignalList() << Move(12,5,6,0) << Insert(11,8)) + << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(11,8)); + QTest::newRow("m(12-5,6),i(8,4)") + << (SignalList() << Move(12,5,6,0) << Insert(8,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(5,3,0,0) << Insert(8,4) << Insert(12,3,0,3)); + QTest::newRow("m(12-5,6),i(2,4)") + << (SignalList() << Move(12,5,6,0) << Insert(2,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(2,4) << Insert(9,6,0,0)); + QTest::newRow("m(12-5,6),i(18,4)") + << (SignalList() << Move(12,5,6,0) << Insert(18,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(18,4)); + QTest::newRow("m(12-5,6),i(20,4)") + << (SignalList() << Move(12,5,6,0) << Insert(20,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(20,4)); + + QTest::newRow("m(12-23,6),i(12,6)") + << (SignalList() << Move(12,23,6,0) << Insert(12,6)) + << (SignalList() << Remove(12,6,0,0) << Insert(12,6) << Insert(29,6,0,0)); + QTest::newRow("m(12-23,6),i(10,4)") + << (SignalList() << Move(12,23,6,0) << Insert(10,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(10,4) << Insert(27,6,0,0)); + QTest::newRow("m(12-23,6),i(16,4)") + << (SignalList() << Move(12,23,6,0) << Insert(16,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(16,4) << Insert(27,6,0,0)); + QTest::newRow("m(12-23,6),i(13,4)") + << (SignalList() << Move(12,23,6,0) << Insert(13,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(13,4) << Insert(27,6,0,0)); + QTest::newRow("m(12-23,6),i(14,4)") + << (SignalList() << Move(12,23,6,0) << Insert(14,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(14,4) << Insert(27,6,0,0)); + QTest::newRow("m(12-23,6),i(12,4)") + << (SignalList() << Move(12,23,6,0) << Insert(12,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(12,4) << Insert(27,6,0,0)); + QTest::newRow("m(12-23,6),i(11,8)") + << (SignalList() << Move(12,23,6,0) << Insert(11,8)) + << (SignalList() << Remove(12,6,0,0) << Insert(11,8) << Insert(31,6,0,0)); + QTest::newRow("m(12-23,6),i(8,4)") + << (SignalList() << Move(12,23,6,0) << Insert(8,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(8,4) << Insert(27,6,0,0)); + QTest::newRow("m(12-23,6),i(2,4)") + << (SignalList() << Move(12,23,6,0) << Insert(2,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(2,4) << Insert(27,6,0,0)); + QTest::newRow("m(12-23,6),i(18,4)") + << (SignalList() << Move(12,23,6,0) << Insert(18,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(18,4) << Insert(27,6,0,0)); + QTest::newRow("m(12-23,6),i(20,4)") + << (SignalList() << Move(12,23,6,0) << Insert(20,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(20,4) << Insert(27,6,0,0)); + + // Move,then remove + QTest::newRow("m(12-5,6),r(12,6)") + << (SignalList() << Move(12,5,6,0) << Remove(12,6)) + << (SignalList() << Remove(6,6) << Remove(6,6,0,0) << Insert(5,6,0,0)); + QTest::newRow("m(12-5,6),r(10,4)") + << (SignalList() << Move(12,5,6,0) << Remove(10,4)) // ### + << (SignalList() << Remove(5,3) << Remove(9,6,0,0) << Insert(5,5,0,0)); + QTest::newRow("m(12-5,6),r(16,4)") + << (SignalList() << Move(12,5,6,0) << Remove(16,4)) + << (SignalList() << Remove(10,2) << Remove(10,6,0,0) << Remove(10,2) << Insert(5,6,0,0)); + QTest::newRow("m(12-5,6),r(13,4)") + << (SignalList() << Move(12,5,6,0) << Remove(13,4)) + << (SignalList() << Remove(7,4) << Remove(8,6,0,0) << Insert(5,6,0,0)); + QTest::newRow("m(12-5,6),r(14,4)") + << (SignalList() << Move(12,5,6,0) << Remove(14,4)) + << (SignalList() << Remove(8,4) << Remove(8,6,0,0) << Insert(5,6,0,0)); + QTest::newRow("m(12-5,6),r(12,4)") + << (SignalList() << Move(12,5,6,0) << Remove(12,4)) + << (SignalList() << Remove(6,4) << Remove(8,6,0,0) << Insert(5,6,0,0)); + QTest::newRow("m(12-5,6),r(11,8)") + << (SignalList() << Move(12,5,6,0) << Remove(11,8)) + << (SignalList() << Remove(5,7) << Remove(5,6,0,0) << Remove(5,1) << Insert(5,6,0,0)); + QTest::newRow("m(12-5,6),r(8,4)") + << (SignalList() << Move(12,5,6,0) << Remove(8,4)) // ### + << (SignalList() << Remove(5,1) << Remove(11,6,0,0) << Insert(5,3,0,0)); + QTest::newRow("m(12-5,6),r(2,4)") + << (SignalList() << Move(12,5,6,0) << Remove(2,4)) + << (SignalList() << Remove(2,3) << Remove(9,6,0,0) << Insert(2,5,0,1)); + QTest::newRow("m(12-5,6),r(6,4)") + << (SignalList() << Move(12,5,6,0) << Remove(6,4)) + << (SignalList() << Remove(12,6,0,0) << Insert(5,1,0,0) << Insert(6,1,0,5)); + QTest::newRow("m(12-5,6),r(18,4)") + << (SignalList() << Move(12,5,6,0) << Remove(18,4)) + << (SignalList() << Remove(12,6,0,0) << Remove(12,4) << Insert(5,6,0,0)); + QTest::newRow("m(12-5,6),r(20,4)") + << (SignalList() << Move(12,5,6,0) << Remove(20,4)) + << (SignalList() << Remove(12,6,0,0) << Remove(14,4) << Insert(5,6,0,0)); + + QTest::newRow("m(12-23,6),r(12,6)") + << (SignalList() << Move(12,23,6,0) << Remove(12,6)) + << (SignalList() << Remove(12,6,0,0) << Remove(12,6) << Insert(17,6,0,0)); + QTest::newRow("m(12-23,6),r(10,4)") + << (SignalList() << Move(12,23,6,0) << Remove(10,4)) + << (SignalList() << Remove(10,2) << Remove(10,6,0,0) << Remove(10,2) << Insert(19,6,0,0)); + QTest::newRow("m(12-23,6),r(16,4)") + << (SignalList() << Move(12,23,6,0) << Remove(16,4)) + << (SignalList() << Remove(12,6,0,0) << Remove(16,4) << Insert(19,6,0,0)); + QTest::newRow("m(12-23,6),r(13,4)") + << (SignalList() << Move(12,23,6,0) << Remove(13,4)) + << (SignalList() << Remove(12,6,0,0) << Remove(13,4) << Insert(19,6,0,0)); + QTest::newRow("m(12-23,6),r(14,4)") + << (SignalList() << Move(12,23,6,0) << Remove(14,4)) + << (SignalList() << Remove(12,6,0,0) << Remove(14,4) << Insert(19,6,0,0)); + QTest::newRow("m(12-23,6),r(12,4)") + << (SignalList() << Move(12,23,6,0) << Remove(12,4)) + << (SignalList() << Remove(12,6,0,0) << Remove(12,4) << Insert(19,6,0,0)); + QTest::newRow("m(12-23,6),r(11,8)") + << (SignalList() << Move(12,23,6,0) << Remove(11,8)) + << (SignalList() << Remove(11,1) << Remove(11,6,0,0) << Remove(11,7) << Insert(15,6,0,0)); + QTest::newRow("m(12-23,6),r(8,4)") + << (SignalList() << Move(12,23,6,0) << Remove(8,4)) + << (SignalList() << Remove(8,4) << Remove(8,6,0,0) << Insert(19,6,0,0)); + QTest::newRow("m(12-23,6),r(2,4)") + << (SignalList() << Move(12,23,6,0) << Remove(2,4)) + << (SignalList() << Remove(2,4) << Remove(8,6,0,0) << Insert(19,6,0,0)); + QTest::newRow("m(12-23,6),r(18,4)") + << (SignalList() << Move(12,23,6,0) << Remove(18,4)) + << (SignalList() << Remove(12,6,0,0) << Remove(18,4) << Insert(19,6,0,0)); + QTest::newRow("m(12-23,6),r(20,4)") + << (SignalList() << Move(12,23,6,0) << Remove(20,4)) + << (SignalList() << Remove(12,6,0,0) << Remove(20,3) << Insert(20,5,0,1)); + + + // Complex + QTest::newRow("r(15,1),r(22,1)") + << (SignalList() << Remove(15,1) << Remove(22,1)) + << (SignalList() << Remove(15,1) << Remove(22,1)); + QTest::newRow("r(15,1),r(22,1),r(25,1)") + << (SignalList() << Remove(15,1) << Remove(22,1) << Remove(25,1)) + << (SignalList() << Remove(15,1) << Remove(22,1) << Remove(25,1)); + QTest::newRow("r(15,1),r(22,1),r(25,1),r(15,1)") + << (SignalList() << Remove(15,1) << Remove(22,1) << Remove(25,1) << Remove(15,1)) + << (SignalList() << Remove(15,2) << Remove(21,1) << Remove(24,1)); + QTest::newRow("r(15,1),r(22,1),r(25,1),r(15,1),r(13,1)") + << (SignalList() << Remove(15,1) << Remove(22,1) << Remove(25,1) << Remove(15,1) << Remove(13,1)) + << (SignalList() << Remove(13,1) << Remove(14,2) << Remove(20,1) << Remove(23,1)); + QTest::newRow("r(15,1),r(22,1),r(25,1),r(15,1),r(13,1),r(13,1)") + << (SignalList() << Remove(15,1) << Remove(22,1) << Remove(25,1) << Remove(15,1) << Remove(13,1) << Remove(13,1)) + << (SignalList() << Remove(13,4) << Remove(19,1) << Remove(22,1)); + QTest::newRow("r(15,1),r(22,1),r(25,1),r(15,1),r(13,1),r(13,1),m(12,13,1)") + << (SignalList() << Remove(15,1) << Remove(22,1) << Remove(25,1) << Remove(15,1) << Remove(13,1) << Remove(13,1) << Move(12,13,1,0)) + << (SignalList() << Remove(12,1,0,0) << Remove(12,4) << Remove(18,1) << Remove(21,1) << Insert(13,1,0,0)); + + QTest::newRow("r(12,18),r(3,0)") + << (SignalList() << Remove(12,18) << Remove(3,0)) + << (SignalList() << Remove(12,18)); + QTest::newRow("r(12,18),r(3,0),r(1,2)") + << (SignalList() << Remove(12,18) << Remove(3,0) << Remove(1,2)) + << (SignalList() << Remove(1,2) << Remove(10,18)); + QTest::newRow("r(12,18),r(3,0),r(1,2),m(4,0,11)") + << (SignalList() << Remove(12,18) << Remove(3,0) << Remove(1,2) << Move(4,0,11,0)) + << (SignalList() << Remove(1,2) << Remove(4,6,0,0) << Remove(4,18) << Remove(4,5,0,6) << Insert(0,11,0,0)); + QTest::newRow("r(12,18),r(3,0),r(1,2),m(4,0,11),r(14,3)") + << (SignalList() << Remove(12,18) << Remove(3,0) << Remove(1,2) << Move(4,0,11,0) << Remove(14,3)) + << (SignalList() << Remove(1,2) << Remove(3,1) << Remove(3,6,0,0) << Remove(3,18) << Remove(3,5,0,6) << Remove(3,2) << Insert(0,11,0,0)); + + QTest::newRow("m(9,11,14),i(16,1)") + << (SignalList() << Move(9,11,14,0) << Insert(16,1)) + << (SignalList() << Remove(9,14,0,0) << Insert(11,5,0,0) << Insert(16,1) << Insert(17,9,0,5)); + QTest::newRow("m(9,11,14),i(16,1),m(22,38,3)") + << (SignalList() << Move(9,11,14,0) << Insert(16,1) << Move(22,38,3,1)) + << (SignalList() << Remove(9,14,0,0) << Insert(11,5,0,0) << Insert(16,1) << Insert(17,5,0,5) << Insert(22,1,0,13) << Insert(38,3,0,10)); + + QTest::newRow("i(28,2),m(7,5,22)") + << (SignalList() << Insert(28,2) << Move(7,5,22,0)) + << (SignalList() << Remove(7,21,0,0) << Insert(5,21,0,0) << Insert(26,1) << Insert(29,1)); + + QTest::newRow("i(16,3),m(18,28,15)") + << (SignalList() << Insert(16,3) << Move(18,28,15,0)) + << (SignalList() << Remove(16,14,0,1) << Insert(16,2) << Insert(28,1) << Insert(29,14,0,1)); + + QTest::newRow("m(33,12,6),m(18,20,20)") + << (SignalList() << Move(22,12,6,0) << Move(18,20,20,1)) + << (SignalList() << Remove(12,10,1,0) << Remove(12,6,0,0) << Remove(12,10,1,10) + << Insert(12,6,0,0) << Insert(20,20,1,0)); + QTest::newRow("m(33,12,6),m(18,20,20),m(38,19,1)") + << (SignalList() << Move(22,12,6,0) << Move(18,20,20,1) << Move(28,19,1,2)) + << (SignalList() << Remove(12,10,1,0) << Remove(12,6,0,0) << Remove(12,10,1,10) + << Insert(12,6,0,0) << Insert(19,1,1,8) << Insert(21,8,1,0) << Insert(29,11,1,9)); + QTest::newRow("m(33,12,6),m(18,20,20),m(38,19,1),r(34,4)") + << (SignalList() << Move(22,12,6,0) << Move(18,20,20,1) << Move(28,19,1,2) << Remove(34,4)) + << (SignalList() << Remove(12,10,1,0) << Remove(12,6,0,0) << Remove(12,10,1,10) + << Insert(12,6,0,0) << Insert(19,1,1,8) << Insert(21,8,1,0) << Insert(29,5,1,9) << Insert(34,2,1,18)); + QTest::newRow("m(33,12,6),m(18,20,20),m(38,19,1),r(34,4),m(13,9,15)") + << (SignalList() << Move(22,12,6,0) << Move(18,20,20,1) << Move(28,19,1,2) << Remove(34,4) << Move(13,9,15,3)) + << (SignalList() << Remove(12,10,1,0) << Remove(12,6,0,0) << Remove(12,10,1,10) << Remove(12,1,3,5) << Remove(12,1,3,7) + << Insert(9,5,0,1) << Insert(14,1,3,5) << Insert(15,1,1,8) << Insert(16,1,3,7) << Insert(17,7,1,0) << Insert(27,1,0,0) << Insert(28,1,1,7) << Insert(29,5,1,9) << Insert(34,2,1,18)); + + QTest::newRow("i(8,5),m(14,26,14)") + << (SignalList() << Insert(8,5) << Move(14,26,14,0)) + << (SignalList() << Remove(9,14,0,0) << Insert(8,5) << Insert(26,14,0,0)); + QTest::newRow("i(8,5),m(14,26,14),r(45,0)") + << (SignalList() << Insert(8,5) << Move(14,26,14,0) << Remove(45,0)) + << (SignalList() << Remove(9,14,0,0) << Insert(8,5) << Insert(26,14,0,0)); + QTest::newRow("i(8,5),m(14,26,14),r(45,0),m(5,8,21)") + << (SignalList() << Insert(8,5) << Move(14,26,14,0) << Remove(45,0) << Move(5,8,21,1)) + << (SignalList() << Remove(5,3,1,0) << Remove(5,1,1,8) << Remove(5,14,0,0) << Remove(5,12,1,9) + << Insert(5,3,0,0) << Insert(8,3,1,0) << Insert(11,5) << Insert(16,13,1,8) << Insert(29,11,0,3)); + + QTest::newRow("i(35,1),r(5,31)") + << (SignalList() << Insert(35,1) << Remove(5,31)) + << (SignalList() << Remove(5,30)); + QTest::newRow("i(35,1),r(5,31),m(9,8,1)") + << (SignalList() << Insert(35,1) << Remove(5,31) << Move(9,8,1,0)) + << (SignalList() << Remove(5,30) << Remove(9,1,0,0) << Insert(8,1,0,0)); + QTest::newRow("i(35,1),r(5,31),m(9,8,1),i(7,2)") + << (SignalList() << Insert(35,1) << Remove(5,31) << Move(9,8,1,0) << Insert(7,2)) + << (SignalList() << Remove(5,30) << Remove(9,1,0,0) << Insert(7,2) << Insert(10,1,0,0)); + QTest::newRow("i(35,1),r(5,31),m(9,8,1),i(7,2),r(4,3)") + << (SignalList() << Insert(35,1) << Remove(5,31) << Move(9,8,1,0) << Insert(7,2) << Remove(4,3)) + << (SignalList() << Remove(4,33) << Remove(6,1,0,0) << Insert(4,2) << Insert(7,1,0,0)); + + QTest::newRow("r(37,0),r(21,1)") + << (SignalList() << Remove(37,0) << Remove(21,1)) + << (SignalList() << Remove(21,1)); + QTest::newRow("r(37,0),r(21,1),m(27,35,2)") + << (SignalList() << Remove(37,0) << Remove(21,1) << Move(27,35,2,0)) + << (SignalList() << Remove(21,1) << Remove(27,2,0,0) << Insert(35,2,0,0)); + QTest::newRow("r(37,0),r(21,1),m(27,35,2),i(31,5)") + << (SignalList() << Remove(37,0) << Remove(21,1) << Move(27,35,2,0) << Insert(31,5)) + << (SignalList() << Remove(21,1) << Remove(27,2,0,0) << Insert(31,5) << Insert(40,2,0,0)); + QTest::newRow("r(37,0),r(21,1),m(27,35,2),i(31,5),r(10,31)") + << (SignalList() << Remove(37,0) << Remove(21,1) << Move(27,35,2,0) << Insert(31,5) << Remove(10,31)) + << (SignalList() << Remove(10, 18) << Remove(10,2,0,0) << Remove(10,8) << Insert(10,1,0,1)); + + QTest::newRow("m(1,1,39),r(26,10)") + << (SignalList() << Move(1,1,39,0) << Remove(26,10)) + << (SignalList() << Remove(1,39,0,0) << Insert(1,25,0,0) << Insert(26,4,0,35)); + QTest::newRow("m(1,1,39),r(26,10),i(10,5)") + << (SignalList() << Move(1,1,39,0) << Remove(26,10) << Insert(10,5)) + << (SignalList() << Remove(1,39,0,0) << Insert(1,9,0,0) << Insert(10,5) << Insert(15,16,0,9) << Insert(31,4,0,35)); + QTest::newRow("m(1,1,39),r(26,10),i(10,5),i(27,3)") + << (SignalList() << Move(1,1,39,0) << Remove(26,10) << Insert(10,5) << Insert(27,3)) + << (SignalList() << Remove(1,39,0,0) + << Insert(1,9,0,0) << Insert(10,5) << Insert(15,12,0,9) << Insert(27,3) << Insert(30,4,0,21) << Insert(34,4,0,35)); + QTest::newRow("m(1,1,39),r(26,10),i(10,5),i(27,3),r(28,5)") + << (SignalList() << Move(1,1,39,0) << Remove(26,10) << Insert(10,5) << Insert(27,3) << Remove(28,5)) + << (SignalList() << Remove(1,39,0,0) + << Insert(1,9,0,0) << Insert(10,5) << Insert(15,12,0,9) << Insert(27,1) << Insert(28,1,0,24) << Insert(29,4,0,35)); + + QTest::newRow("i(36,4)m(25,39,5)") + << (SignalList() << Insert(36,4) << Move(25,39,5,0)) + << (SignalList() << Remove(25,5,0,0) << Insert(31,4) << Insert(39,5,0,0)); + QTest::newRow("i(36,4)m(25,39,5),i(16,5)") + << (SignalList() << Insert(36,4) << Move(25,39,5,0) << Insert(16,5)) + << (SignalList() << Remove(25,5,0,0) << Insert(16,5) << Insert(36,4) << Insert(44,5,0,0)); + QTest::newRow("i(36,4)m(25,39,5),i(16,5),i(37,5)") + << (SignalList() << Insert(36,4) << Move(25,39,5,0) << Insert(16,5) << Insert(37,5)) + << (SignalList() << Remove(25,5,0,0) << Insert(16,5) << Insert(36,9) << Insert(49,5,0,0)); + QTest::newRow("i(36,4)m(25,39,5),i(16,5),i(37,5),m(40,21,11)") + << (SignalList() << Insert(36,4) << Move(25,39,5,0) << Insert(16,5) << Insert(37,5) << Move(40,21,11,1)) + << (SignalList() << Remove(25,5,0,0) << Remove(31,4,1,5) + << Insert(16,10) << Insert(26,4,1,5) << Insert(30,2,0,0) << Insert(47,4) << Insert(51,3,0,2)); + + QTest::newRow("i(24,1),r(33,4)") + << (SignalList() << Insert(24,1) << Remove(33,4)) + << (SignalList() << Remove(32,4) << Insert(24,1)); + QTest::newRow("i(24,1),r(33,4),r(15,15)") + << (SignalList() << Insert(24,1) << Remove(33,4) << Remove(15,15)) + << (SignalList() << Remove(15,14) << Remove(18,4)); + QTest::newRow("i(24,1),r(33,4),r(15,15),m(8,10,2)") + << (SignalList() << Insert(24,1) << Remove(33,4) << Remove(15,15) << Move(8,10,2,0)) + << (SignalList() << Remove(8,2,0,0) << Remove(13,14) << Remove(16,4) << Insert(10,2,0,0)); + QTest::newRow("i(24,1),r(33,4),r(15,15),m(8,10,2),r(2,19)") + << (SignalList() << Insert(24,1) << Remove(33,4) << Remove(15,15) << Move(8,10,2,0) << Remove(2,19)) + << (SignalList() << Remove(2,6) << Remove(2,2,0,0) << Remove(2,29)); + + QTest::newRow("r(1,35),i(3,4),m(4,2,2)") + << (SignalList() << Remove(1,35) << Insert(3,4) << Move(4,2,2,0)) + << (SignalList() << Remove(1,35) <("input"); + + QTest::newRow("(r(1,35),i(3,4)),(m(4,2,2),r(7,1))") + << (SignalListList() + << (SignalList() << Remove(1,35) << Insert(3,4)) + << (SignalList() << Move(4,2,2,0) << Remove(7,1))); + + QTest::newRow("(i(30,4),m(7,28,16))(m(6,7,13),m(41,35,2))") + << (SignalListList() + << (SignalList() << Insert(30,4) << Move(7,28,16,0)) + << (SignalList() << Move(6,7,13,1) << Move(41,35,2,2))); + + QTest::newRow("(i(35,2),r(39,0))(r(25,11),m(24,8,7))") + << (SignalListList() + << (SignalList() << Insert(35,2) << Remove(39,0)) + << (SignalList() << Remove(25,11) << Move(24,8,7,0))); + + QTest::newRow("i(26,1),i(39,1),m(31,34,2),r(15,27)") + << (SignalListList() + << (SignalList() << Insert(26,1) << Insert(39,1)) + << (SignalList() << Move(31,34,2,0) << Remove(15,27))); + + QTest::newRow("i(19,1),(2,3),r(38,4),m(2,20,3)") + << (SignalListList() + << (SignalList() << Insert(19,1) << Insert(2,3)) + << (SignalList() << Remove(38,4) << Move(2,20,3,0))); + + QTest::newRow("i(4,3),i(19,1),i(31,3),m(8,10,29)") + << (SignalListList() + << (SignalList() << Insert(4,3) << Insert(19,1)) + << (SignalList() << Insert(31,3) << Move(8,10,29,0))); + + QTest::newRow("m(18,15,16),i(0,1),i(32,2),i(29,2)") + << (SignalListList() + << (SignalList() << Move(18,15,16,0) << Insert(0,1)) + << (SignalList() << Insert(32,2) << Insert(29,2))); + + QTest::newRow("i(38,5),i(12,5),i(48,3),m(28,6,6)") + << (SignalListList() + << (SignalList() << Insert(38,5) << Insert(12,5)) + << (SignalList() << Insert(48,3) << Move(28,6,6,0))); + + QTest::newRow("r(8,9),m(7,10,18),m(8,10,18),i(17,2)") + << (SignalListList() + << (SignalList() << Remove(8,9) << Move(7,10,18,0)) + << (SignalList() << Move(8,10,18,1) << Insert(17,2))); + + QTest::newRow("r(39,0),m(18,1,21),m(2,6,31),r(9,4)") + << (SignalListList() + << (SignalList() << Remove(39,0) << Move(18,1,21,0)) + << (SignalList() << Move(2,6,31,1) << Remove(9,4))); + + QTest::newRow("3*5 (5)") + << (SignalListList() + << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5))); + QTest::newRow("3*5 (6)") + << (SignalListList() + << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) + << (SignalList() << Insert(1,1))); + QTest::newRow("3*5 (7)") + << (SignalListList() + << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) + << (SignalList() << Insert(1,1) << Move(9,32,3,1))); + QTest::newRow("3*5 (8)") + << (SignalListList() + << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) + << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1))); + QTest::newRow("3*5 (9)") + << (SignalListList() + << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) + << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3))); + QTest::newRow("3*5 (10)") + << (SignalListList() + << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) + << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3) << Move(7,15,23,2))); + QTest::newRow("3*5 (11)") + << (SignalListList() + << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) + << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3) << Move(7,15,23,2)) + << (SignalList() << Move(38,23,1,3))); + QTest::newRow("3*5 (12)") + << (SignalListList() + << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) + << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3) << Move(7,15,23,2)) + << (SignalList() << Move(38,23,1,3) << Move(38,31,0,4))); + QTest::newRow("3*5 (13)") + << (SignalListList() + << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) + << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3) << Move(7,15,23,2)) + << (SignalList() << Move(38,23,1,3) << Move(38,31,0,4) << Remove(26,11))); + QTest::newRow("3*5 (14)") + << (SignalListList() + << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) + << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3) << Move(7,15,23,2)) + << (SignalList() << Move(38,23,1,3) << Move(38,31,0,4) << Remove(26,11) << Move(5,7,18,5))); + QTest::newRow("3*5 (15)") + << (SignalListList() + << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) + << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3) << Move(7,15,23,2)) + << (SignalList() << Move(38,23,1,3) << Move(38,31,0,4) << Remove(26,11) << Move(5,7,18,5) << Move(19,0,8,6))); +} + +void tst_qqmlchangeset::apply() +{ + QFETCH(SignalListList, input); + + QQmlChangeSet set; + QQmlChangeSet linearSet; + + foreach (const SignalList &list, input) { + QQmlChangeSet intermediateSet; + foreach (const Signal &signal, list) { + if (signal.isRemove()) { + intermediateSet.remove(signal.index, signal.count); + linearSet.remove(signal.index, signal.count); + } else if (signal.isInsert()) { + intermediateSet.insert(signal.index, signal.count); + linearSet.insert(signal.index, signal.count); + } else if (signal.isMove()) { + intermediateSet.move(signal.index, signal.to, signal.count, signal.moveId); + linearSet.move(signal.index, signal.to, signal.count, signal.moveId); + } + } + set.apply(intermediateSet); + } + + SignalList changes; + foreach (const QQmlChangeSet::Remove &remove, set.removes()) + changes << Remove(remove.index, remove.count, remove.moveId, remove.offset); + foreach (const QQmlChangeSet::Insert &insert, set.inserts()) + changes << Insert(insert.index, insert.count, insert.moveId, insert.offset); + + SignalList linearChanges; + foreach (const QQmlChangeSet::Remove &remove, linearSet.removes()) + linearChanges << Remove(remove.index, remove.count, remove.moveId, remove.offset); + foreach (const QQmlChangeSet::Insert &insert, linearSet.inserts()) + linearChanges << Insert(insert.index, insert.count, insert.moveId, insert.offset); + + // The output in the failing tests isn't incorrect, merely sub-optimal. + QEXPECT_FAIL("3*5 (10)", "inserts not joined when dividing space removed", Abort); + QEXPECT_FAIL("3*5 (11)", "inserts not joined when dividing space removed", Abort); + QEXPECT_FAIL("3*5 (12)", "inserts not joined when dividing space removed", Abort); + QEXPECT_FAIL("3*5 (13)", "inserts not joined when dividing space removed", Abort); + QEXPECT_FAIL("3*5 (14)", "inserts not joined when dividing space removed", Abort); + QEXPECT_FAIL("3*5 (15)", "inserts not joined when dividing space removed", Abort); + QCOMPARE(changes, linearChanges); +} + +void tst_qqmlchangeset::removeConsecutive_data() +{ + QTest::addColumn("input"); + QTest::addColumn("output"); + + QTest::newRow("at start") + << (SignalList() << Remove(0,2) << Remove(0,1) << Remove(0,5)) + << (SignalList() << Remove(0,8)); + QTest::newRow("offset") + << (SignalList() << Remove(3,2) << Remove(3,1) << Remove(3,5)) + << (SignalList() << Remove(3,8)); + QTest::newRow("with move") + << (SignalList() << Remove(0,2) << Remove(0,1,0,0) << Remove(0,5)) + << (SignalList() << Remove(0,2) << Remove(0,1,0,0) << Remove(0,5)); +} + +void tst_qqmlchangeset::removeConsecutive() +{ + QFETCH(SignalList, input); + QFETCH(SignalList, output); + + QVector removes; + foreach (const Signal &signal, input) { + QVERIFY(signal.isRemove()); + removes.append(QQmlChangeSet::Remove(signal.index, signal.count, signal.moveId, signal.offset)); + } + + QQmlChangeSet set; + set.remove(removes); + + SignalList changes; + foreach (const QQmlChangeSet::Remove &remove, set.removes()) + changes << Remove(remove.index, remove.count, remove.moveId, remove.offset); + QVERIFY(set.inserts().isEmpty()); + QVERIFY(set.changes().isEmpty()); + + VERIFY_EXPECTED_OUTPUT + QCOMPARE(changes, output); +} + +void tst_qqmlchangeset::insertConsecutive_data() +{ + QTest::addColumn("input"); + QTest::addColumn("output"); + + QTest::newRow("at start") + << (SignalList() << Insert(0,2) << Insert(2,1) << Insert(3,5)) + << (SignalList() << Insert(0,8)); + QTest::newRow("offset") + << (SignalList() << Insert(3,2) << Insert(5,1) << Insert(6,5)) + << (SignalList() << Insert(3,8)); + QTest::newRow("with move") + << (SignalList() << Insert(0,2) << Insert(2,1,0,0) << Insert(3,5)) + << (SignalList() << Insert(0,2) << Insert(2,1,0,0) << Insert(3,5)); +} + +void tst_qqmlchangeset::insertConsecutive() +{ + QFETCH(SignalList, input); + QFETCH(SignalList, output); + + QVector inserts; + foreach (const Signal &signal, input) { + QVERIFY(signal.isInsert()); + inserts.append(QQmlChangeSet::Insert(signal.index, signal.count, signal.moveId, signal.offset)); + } + + QQmlChangeSet set; + set.insert(inserts); + + SignalList changes; + foreach (const QQmlChangeSet::Insert &insert, set.inserts()) + changes << Insert(insert.index, insert.count, insert.moveId, insert.offset); + QVERIFY(set.removes().isEmpty()); + QVERIFY(set.changes().isEmpty()); + + VERIFY_EXPECTED_OUTPUT + QCOMPARE(changes, output); +} + +void tst_qqmlchangeset::copy() +{ + QQmlChangeSet changeSet; + changeSet.remove(0, 12); + changeSet.remove(5, 4); + changeSet.insert(3, 9); + changeSet.insert(15, 2); + changeSet.change(24, 8); + changeSet.move(3, 5, 9, 0); + + QQmlChangeSet copy(changeSet); + + QQmlChangeSet assign; + assign = changeSet; + + copy.move(4, 2, 5, 1); + assign.move(4, 2, 5, 1); + changeSet.move(4, 2, 5, 1); + + QCOMPARE(copy.removes(), changeSet.removes()); + QCOMPARE(copy.inserts(), changeSet.inserts()); + QCOMPARE(copy.changes(), changeSet.changes()); + QCOMPARE(copy.difference(), changeSet.difference()); + + QCOMPARE(assign.removes(), changeSet.removes()); + QCOMPARE(assign.inserts(), changeSet.inserts()); + QCOMPARE(assign.changes(), changeSet.changes()); + QCOMPARE(assign.difference(), changeSet.difference()); +} + +void tst_qqmlchangeset::debug() +{ + QQmlChangeSet changeSet; + changeSet.remove(0, 12); + changeSet.remove(5, 4); + changeSet.insert(3, 9); + changeSet.insert(15, 2); + changeSet.change(24, 8); + + QTest::ignoreMessage(QtDebugMsg, "QQmlChangeSet(Remove(0,12) Remove(5,4) Insert(3,9) Insert(15,2) Change(24,8) )"); + qDebug() << changeSet; + + changeSet.clear(); + + QTest::ignoreMessage(QtDebugMsg, "QQmlChangeSet(Remove(12,4,0,0) Insert(5,4,0,0) )"); + + changeSet.move(12, 5, 4, 0); + qDebug() << changeSet; +} + +void tst_qqmlchangeset::random_data() +{ + QTest::addColumn("seed"); + QTest::addColumn("combinations"); + QTest::addColumn("depth"); + QTest::newRow("1*5") << 32 << 1 << 5; + QTest::newRow("2*2") << 32 << 2 << 2; + QTest::newRow("3*2") << 32 << 3 << 2; + QTest::newRow("3*5") << 32 << 3 << 5; +} + +void tst_qqmlchangeset::random() +{ + QFETCH(int, seed); + QFETCH(int, combinations); + QFETCH(int, depth); + + qsrand(seed); + + int failures = 0; + for (int i = 0; i < 20000; ++i) { + QQmlChangeSet accumulatedSet; + SignalList input; + + int modelCount = 40; + int moveCount = 0; + + for (int j = 0; j < combinations; ++j) { + QQmlChangeSet set; + for (int k = 0; k < depth; ++k) { + switch (-(qrand() % 3)) { + case InsertOp: { + int index = qrand() % (modelCount + 1); + int count = qrand() % 5 + 1; + set.insert(index, count); + input.append(Insert(index, count)); + modelCount += count; + break; + } + case RemoveOp: { + const int index = qrand() % (modelCount + 1); + const int count = qrand() % (modelCount - index + 1); + set.remove(index, count); + input.append(Remove(index, count)); + modelCount -= count; + break; + } + case MoveOp: { + const int from = qrand() % (modelCount + 1); + const int count = qrand() % (modelCount - from + 1); + const int to = qrand() % (modelCount - count + 1); + const int moveId = moveCount++; + set.move(from, to, count, moveId); + input.append(Move(from, to, count, moveId)); + break; + } + default: + break; + } + } + accumulatedSet.apply(set); + } + + SignalList output; + foreach (const QQmlChangeSet::Remove &remove, accumulatedSet.removes()) + output << Remove(remove.index, remove.count, remove.moveId, remove.offset); + foreach (const QQmlChangeSet::Insert &insert, accumulatedSet.inserts()) + output << Insert(insert.index, insert.count, insert.moveId, insert.offset); + + QVector inputList; + for (int i = 0; i < 40; ++i) + inputList.append(i); + QVector outputList = inputList; + if (!applyChanges(inputList, input)) { + qDebug() << "Invalid input list"; + qDebug() << input; + qDebug() << inputList; + ++failures; + } else if (!applyChanges(outputList, output)) { + qDebug() << "Invalid output list"; + qDebug() << input; + qDebug() << output; + qDebug() << outputList; + ++failures; + } else if (outputList != inputList) { + qDebug() << "Input/output mismatch"; + qDebug() << input; + qDebug() << output; + qDebug() << inputList; + qDebug() << outputList; + ++failures; + } + } + QCOMPARE(failures, 0); +} + +QTEST_MAIN(tst_qqmlchangeset) + +#include "tst_qqmlchangeset.moc" diff --git a/tests/auto/qml/qqmllistcompositor/qqmllistcompositor.pro b/tests/auto/qml/qqmllistcompositor/qqmllistcompositor.pro new file mode 100644 index 0000000000..e6c9dc3a29 --- /dev/null +++ b/tests/auto/qml/qqmllistcompositor/qqmllistcompositor.pro @@ -0,0 +1,10 @@ +CONFIG += testcase +TARGET = tst_qqmllistcompositor +macx:CONFIG -= app_bundle + +SOURCES += tst_qqmllistcompositor.cpp + +CONFIG += parallel_test + +QT += core-private gui-private qml-private quick-private testlib +DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/qml/qqmllistcompositor/tst_qqmllistcompositor.cpp b/tests/auto/qml/qqmllistcompositor/tst_qqmllistcompositor.cpp new file mode 100644 index 0000000000..d5e85f478d --- /dev/null +++ b/tests/auto/qml/qqmllistcompositor/tst_qqmllistcompositor.cpp @@ -0,0 +1,1740 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include + +template int lengthOf(const T (&)[N]) { return N; } + +typedef QQmlListCompositor C; + +struct Range +{ + Range() {} + Range(void *list, int index, int count, int flags) + : list(list), index(index), count(count), flags(flags) {} + void *list; + int index; + int count; + int flags; +}; + +template struct Array +{ + Array() : array(0), count(0) {} + template Array(const T (&array)[N]) : array(array), count(N) {} + + T operator [](int index) const { return array[index]; } + + const T *array; + int count; +}; + +typedef Array IndexArray; +typedef Array ListArray; + +typedef QVector RemoveList; +typedef QVector InsertList; +typedef QVector ChangeList; + +typedef QVector RangeList; + +Q_DECLARE_METATYPE(RangeList) +Q_DECLARE_METATYPE(RemoveList) +Q_DECLARE_METATYPE(InsertList) +Q_DECLARE_METATYPE(ChangeList) +Q_DECLARE_METATYPE(void *) +Q_DECLARE_METATYPE(IndexArray) +Q_DECLARE_METATYPE(ListArray) +Q_DECLARE_METATYPE(C::Group) + +QT_BEGIN_NAMESPACE +bool operator ==(const C::Change &left, const C::Change &right) +{ + return left.index[3] == right.index[3] + && left.index[2] == right.index[2] + && left.index[1] == right.index[1] + && left.index[0] == right.index[0] + && left.count == right.count + && left.groups() == right.groups() + && left.inCache() == right.inCache() + && (left.moveId == -1) == (right.moveId == -1); +} +QT_END_NAMESPACE + +static const C::Group Visible = C::Group(2); +static const C::Group Selection = C::Group(3); + +class tst_qqmllistcompositor : public QObject +{ + Q_OBJECT + + enum { + VisibleFlag = 0x04, + SelectionFlag = 0x08 + }; + + void populateChange( + C::Change &change, int sIndex, int vIndex, int dIndex, int cIndex, int count, int flags, int moveId) + { + change.index[Selection] = sIndex; + change.index[Visible] = vIndex; + change.index[C::Default] = dIndex; + change.index[C::Cache] = cIndex; + change.count = count; + change.flags = flags; + change.moveId = moveId; + } + + C::Remove Remove( + int sIndex, int vIndex, int dIndex, int cIndex, int count, int flags, int moveId = -1) + { + C::Remove remove; + populateChange(remove, sIndex, vIndex, dIndex, cIndex, count, flags, moveId); + return remove; + } + + C::Insert Insert( + int sIndex, int vIndex, int dIndex, int cIndex, int count, int flags, int moveId = -1) + { + C::Insert insert; + populateChange(insert, sIndex, vIndex, dIndex, cIndex, count, flags, moveId); + return insert; + } + + C::Change Change( + int sIndex, int vIndex, int dIndex, int cIndex, int count, int flags, int moveId = -1) + { + C::Change change; + populateChange(change, sIndex, vIndex, dIndex, cIndex, count, flags, moveId); + return change; + } + +private slots: + void find_data(); + void find(); + void findInsertPosition_data(); + void findInsertPosition(); + void insert(); + void clearFlags_data(); + void clearFlags(); + void setFlags_data(); + void setFlags(); + void move_data(); + void move(); + void moveFromEnd(); + void clear(); + void listItemsInserted_data(); + void listItemsInserted(); + void listItemsRemoved_data(); + void listItemsRemoved(); + void listItemsMoved_data(); + void listItemsMoved(); + void listItemsChanged_data(); + void listItemsChanged(); + void compositorDebug(); + void changeDebug(); + void groupDebug(); +}; + +void tst_qqmllistcompositor::find_data() +{ + QTest::addColumn("ranges"); + QTest::addColumn("startGroup"); + QTest::addColumn("startIndex"); + QTest::addColumn("group"); + QTest::addColumn("index"); + QTest::addColumn("selectionIndex"); + QTest::addColumn("visibleIndex"); + QTest::addColumn("defaultIndex"); + QTest::addColumn("cacheIndex"); + QTest::addColumn("rangeFlags"); + QTest::addColumn("rangeIndex"); + + int listA; void *a = &listA; + + QTest::newRow("Start") + << (RangeList() + << Range(a, 0, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 1, 1, int(C::AppendFlag | C::PrependFlag | C::CacheFlag)) + << Range(0, 0, 1, int(VisibleFlag| C::CacheFlag))) + << C::Cache << 2 + << Selection << 0 + << 0 << 0 << 0 << 0 + << uint(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag) << 0; +} + +void tst_qqmllistcompositor::find() +{ + QFETCH(RangeList, ranges); + QFETCH(C::Group, startGroup); + QFETCH(int, startIndex); + QFETCH(C::Group, group); + QFETCH(int, index); + QFETCH(int, cacheIndex); + QFETCH(int, defaultIndex); + QFETCH(int, visibleIndex); + QFETCH(int, selectionIndex); + QFETCH(uint, rangeFlags); + QFETCH(int, rangeIndex); + + QQmlListCompositor compositor; + compositor.setGroupCount(4); + compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); + + foreach (const Range &range, ranges) + compositor.append(range.list, range.index, range.count, range.flags); + + compositor.find(startGroup, startIndex); + + QQmlListCompositor::iterator it = compositor.find(group, index); + QCOMPARE(it.index[C::Cache], cacheIndex); + QCOMPARE(it.index[C::Default], defaultIndex); + QCOMPARE(it.index[Visible], visibleIndex); + QCOMPARE(it.index[Selection], selectionIndex); + QCOMPARE(it->flags, rangeFlags); + QCOMPARE(it->index, rangeIndex); +} + +void tst_qqmllistcompositor::findInsertPosition_data() +{ + QTest::addColumn("ranges"); + QTest::addColumn("group"); + QTest::addColumn("index"); + QTest::addColumn("selectionIndex"); + QTest::addColumn("visibleIndex"); + QTest::addColumn("defaultIndex"); + QTest::addColumn("cacheIndex"); + QTest::addColumn("rangeFlags"); + QTest::addColumn("rangeIndex"); + + int listA; void *a = &listA; + + QTest::newRow("Start") + << (RangeList() + << Range(a, 0, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 1, 1, int(C::AppendFlag | C::PrependFlag | C::CacheFlag)) + << Range(0, 0, 1, int(VisibleFlag| C::CacheFlag))) + << Selection << 0 + << 0 << 0 << 0 << 0 + << uint(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag) << 0; + QTest::newRow("1") + << (RangeList() + << Range(a, 0, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 1, 1, int(C::AppendFlag | C::PrependFlag | C::CacheFlag)) + << Range(0, 0, 1, int(VisibleFlag| C::CacheFlag))) + << Selection << 1 + << 1 << 1 << 1 << 3 + << uint(0) << 0; +} + +void tst_qqmllistcompositor::findInsertPosition() +{ + QFETCH(RangeList, ranges); + QFETCH(C::Group, group); + QFETCH(int, index); + QFETCH(int, cacheIndex); + QFETCH(int, defaultIndex); + QFETCH(int, visibleIndex); + QFETCH(int, selectionIndex); + QFETCH(uint, rangeFlags); + QFETCH(int, rangeIndex); + + QQmlListCompositor compositor; + compositor.setGroupCount(4); + compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); + + foreach (const Range &range, ranges) + compositor.append(range.list, range.index, range.count, range.flags); + + QQmlListCompositor::insert_iterator it = compositor.findInsertPosition(group, index); + + QCOMPARE(it.index[C::Cache], cacheIndex); + QCOMPARE(it.index[C::Default], defaultIndex); + QCOMPARE(it.index[Visible], visibleIndex); + QCOMPARE(it.index[Selection], selectionIndex); + QCOMPARE(it->flags, rangeFlags); + QCOMPARE(it->index, rangeIndex); +} + +void tst_qqmllistcompositor::insert() +{ + QQmlListCompositor compositor; + compositor.setGroupCount(4); + compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); + + C::iterator it; + + int listA; int *a = &listA; + int listB; int *b = &listB; + int listC; int *c = &listC; + + { + compositor.append(a, 0, 12, C::AppendFlag | C::PrependFlag | C::DefaultFlag); + const int indexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + const int *lists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; + QCOMPARE(compositor.count(C::Default), lengthOf(indexes)); + for (int i = 0; i < lengthOf(indexes); ++i) { + it = compositor.find(C::Default, i); + QCOMPARE(it.list(), lists[i]); + if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); + } + } { + compositor.append(b, 4, 4, C::DefaultFlag); + const int indexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,4,5,6,7}; + const int *lists[] = {a,a,a,a,a,a,a,a,a,a, a, a,b,b,b,b}; + QCOMPARE(compositor.count(C::Default), lengthOf(indexes)); + for (int i = 0; i < lengthOf(indexes); ++i) { + it = compositor.find(C::Default, i); + QCOMPARE(it.list(), lists[i]); + if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); + } + } { // Insert at end. + compositor.insert( + C::Default, 16, c, 2, 2, C::DefaultFlag); + const int indexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,4,5,6,7,2,3}; + const int *lists[] = {a,a,a,a,a,a,a,a,a,a, a, a,b,b,b,b,c,c}; + QCOMPARE(compositor.count(C::Default), lengthOf(indexes)); + for (int i = 0; i < lengthOf(indexes); ++i) { + it = compositor.find(C::Default, i); + QCOMPARE(it.list(), lists[i]); + if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); + } + } { // Insert at start + compositor.insert( + C::Default, 0, c, 6, 4, C::DefaultFlag); + const int indexes[] = {6,7,8,9,0,1,2,3,4,5,6,7,8,9,10,11,4,5,6,7,2,3}; + const int *lists[] = {c,c,c,c,a,a,a,a,a,a,a,a,a,a, a, a,b,b,b,b,c,c}; + for (int i = 0; i < lengthOf(indexes); ++i) { + it = compositor.find(C::Default, i); + QCOMPARE(it.list(), lists[i]); + if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); + } + } { // Insert after static range. + compositor.insert( + C::Default, 4, b, 0, 8, C::AppendFlag | C::PrependFlag | C::DefaultFlag); + const int indexes[] = {6,7,8,9,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,8,9,10,11,4,5,6,7,2,3}; + const int *lists[] = {c,c,c,c,b,b,b,b,b,b,b,b,a,a,a,a,a,a,a,a,a,a, a, a,b,b,b,b,c,c}; + QCOMPARE(compositor.count(C::Default), lengthOf(indexes)); + for (int i = 0; i < lengthOf(indexes); ++i) { + it = compositor.find(C::Default, i); + QCOMPARE(it.list(), lists[i]); + if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); + } + } { // Insert at end of dynamic range. + compositor.insert( + C::Default, 12, c, 0, 4, C::AppendFlag | C::PrependFlag | C::DefaultFlag); + const int indexes[] = {6,7,8,9,0,1,2,3,4,5,6,7,0,1,2,3,0,1,2,3,4,5,6,7,8,9,10,11,4,5,6,7,2,3}; + const int *lists[] = {c,c,c,c,b,b,b,b,b,b,b,b,c,c,c,c,a,a,a,a,a,a,a,a,a,a, a, a,b,b,b,b,c,c}; + QCOMPARE(compositor.count(C::Default), lengthOf(indexes)); + for (int i = 0; i < lengthOf(indexes); ++i) { + it = compositor.find(C::Default, i); + QCOMPARE(it.list(), lists[i]); + if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); + } + } { // Insert into range. + compositor.insert( + C::Default, 8, c, 0, 4, C::AppendFlag | C::PrependFlag | C::DefaultFlag); + const int indexes[] = {6,7,8,9,0,1,2,3,0,1,2,3,4,5,6,7,0,1,2,3,0,1,2,3,4,5,6,7,8,9,10,11,4,5,6,7,2,3}; + const int *lists[] = {c,c,c,c,b,b,b,b,c,c,c,c,b,b,b,b,c,c,c,c,a,a,a,a,a,a,a,a,a,a, a, a,b,b,b,b,c,c}; + QCOMPARE(compositor.count(C::Default), lengthOf(indexes)); + for (int i = 0; i < lengthOf(indexes); ++i) { + it = compositor.find(C::Default, i); + QCOMPARE(it.list(), lists[i]); + if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); + } + } +} + +void tst_qqmllistcompositor::clearFlags_data() +{ + QTest::addColumn("ranges"); + QTest::addColumn("group"); + QTest::addColumn("index"); + QTest::addColumn("count"); + QTest::addColumn("flags"); + QTest::addColumn("expectedRemoves"); + QTest::addColumn("cacheIndexes"); + QTest::addColumn("cacheLists"); + QTest::addColumn("defaultIndexes"); + QTest::addColumn("defaultLists"); + QTest::addColumn("visibleIndexes"); + QTest::addColumn("visibleLists"); + QTest::addColumn("selectionIndexes"); + QTest::addColumn("selectionLists"); + + int listA; void *a = &listA; + + { static const int cacheIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0,0}; + static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0,0}; + static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0,0}; + static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0,0}; + static const int visibleIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0,0}; + static const void *visibleLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0,0}; + static const int selectionIndexes[] = {0,1,4,5,6,7,8,9,10,11,0,0,0,0}; + static const void *selectionLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0,0}; + QTest::newRow("Default, 2, 2, Selection") + << (RangeList() + << Range(a, 0, 12, int(C::AppendFlag | C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << Range(0, 0, 4, int(SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag))) + << C::Default << 2 << 2 << int(SelectionFlag) + << (RemoveList() + << Remove(2, 2, 2, 2, 2, SelectionFlag | C::CacheFlag)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray(visibleIndexes) << ListArray(visibleLists) + << IndexArray(selectionIndexes) << ListArray(selectionLists); + } { static const int cacheIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0,0}; + static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0,0}; + static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0,0}; + static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0,0}; + static const int visibleIndexes[] = {0,2,3,5,6,7,8,9,10,11,0,0,0,0}; + static const void *visibleLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0,0}; + static const int selectionIndexes[] = {0,1,4,5,6,7,8,9,10,11,0,0,0,0}; + static const void *selectionLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0,0}; + QTest::newRow("Selection, 1, 2, Visible") + << (RangeList() + << Range(a, 0, 2, int(C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 2, 2, int(C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 4, 8, int(C::AppendFlag | C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << Range(0, 0, 4, int(SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag))) + << Selection << 1 << 2 << int(VisibleFlag) + << (RemoveList() + << Remove(1, 1, 1, 1, 1, VisibleFlag | C::CacheFlag) + << Remove(2, 3, 4, 4, 1, VisibleFlag | C::CacheFlag)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray(visibleIndexes) << ListArray(visibleLists) + << IndexArray(selectionIndexes) << ListArray(selectionLists); + } { static const int cacheIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0,0}; + static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0,0}; + static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0}; + static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0}; + static const int visibleIndexes[] = {0,2,3,5,6,7,8,9,10,11,0,0,0}; + static const void *visibleLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0}; + static const int selectionIndexes[] = {0,1,4,5,6,7,8,9,10,11,0,0,0}; + static const void *selectionLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0}; + QTest::newRow("Default, 13, 1, Prepend | Selection | Visible | Default") + << (RangeList() + << Range(a, 0, 1, int(C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 1, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 2, 2, int(C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 4, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 5, 7, int(C::AppendFlag | C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << Range(0, 0, 4, int(SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag))) + << C::Default << 13 << 1 << int(C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag) + << (RemoveList() + << Remove(11, 11, 13, 13, 1, SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray(visibleIndexes) << ListArray(visibleLists) + << IndexArray(selectionIndexes) << ListArray(selectionLists); + } { static const int cacheIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,0}; + static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a,a, a,0}; + static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0}; + static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0}; + static const int visibleIndexes[] = {0,2,3,5,6,7,8,9,10,11,0,0,0}; + static const void *visibleLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0}; + static const int selectionIndexes[] = {0,1,4,5,6,7,8,9,10,11,0,0,0}; + static const void *selectionLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0}; + QTest::newRow("Cache, 11, 4, Cache") + << (RangeList() + << Range(a, 0, 1, int(C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 1, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 2, 2, int(C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 4, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 5, 7, int(C::AppendFlag | C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << Range(0, 0, 1, int(C::CacheFlag)) + << Range(0, 0, 3, int(SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag))) + << C::Cache << 11 << 4 << int(C::CacheFlag) + << (RemoveList()) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray(visibleIndexes) << ListArray(visibleLists) + << IndexArray(selectionIndexes) << ListArray(selectionLists); + } { static const int cacheIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,0}; + static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a,a, a,0}; + static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,0}; + static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a,0}; + static const int visibleIndexes[] = {0,2,3,5,6,7,8,9,10,0}; + static const void *visibleLists[] = {a,a,a,a,a,a,a,a, a,0}; + static const int selectionIndexes[] = {0,1,4,5,6,7,8,9,10,0}; + static const void *selectionLists[] = {a,a,a,a,a,a,a,a, a,0}; + QTest::newRow("Default, 11, 3, Default | Visible | Selection") + << (RangeList() + << Range(a, 0, 1, int(C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 1, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 2, 2, int(C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 4, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 5, 6, int(C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << Range(a, 11, 1, int(C::AppendFlag | C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag)) + << Range(0, 0, 2, int(SelectionFlag | VisibleFlag | C::DefaultFlag)) + << Range(0, 0, 1, int(SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag))) + << C::Default << 11 << 3 << int(C::DefaultFlag | VisibleFlag| SelectionFlag) + << (RemoveList() + << Remove(9, 9, 11, 11, 1, SelectionFlag | VisibleFlag | C::DefaultFlag) + << Remove(9, 9, 11, 11, 2, SelectionFlag | VisibleFlag | C::DefaultFlag)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray(visibleIndexes) << ListArray(visibleLists) + << IndexArray(selectionIndexes) << ListArray(selectionLists); + } +} + +void tst_qqmllistcompositor::clearFlags() +{ + QFETCH(RangeList, ranges); + QFETCH(C::Group, group); + QFETCH(int, index); + QFETCH(int, count); + QFETCH(int, flags); + QFETCH(RemoveList, expectedRemoves); + QFETCH(IndexArray, cacheIndexes); + QFETCH(ListArray, cacheLists); + QFETCH(IndexArray, defaultIndexes); + QFETCH(ListArray, defaultLists); + QFETCH(IndexArray, visibleIndexes); + QFETCH(ListArray, visibleLists); + QFETCH(IndexArray, selectionIndexes); + QFETCH(ListArray, selectionLists); + + QQmlListCompositor compositor; + compositor.setGroupCount(4); + compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); + + foreach (const Range &range, ranges) + compositor.append(range.list, range.index, range.count, range.flags); + + QVector removes; + compositor.clearFlags(group, index, count, flags, &removes); + + QCOMPARE(removes, expectedRemoves); + + QCOMPARE(compositor.count(C::Cache), cacheIndexes.count); + for (int i = 0; i < cacheIndexes.count; ++i) { + C::iterator it = compositor.find(C::Cache, i); + QCOMPARE(it->list, cacheLists[i]); + if (cacheLists[i]) + QCOMPARE(it.modelIndex(), cacheIndexes[i]); + } + QCOMPARE(compositor.count(C::Default), defaultIndexes.count); + for (int i = 0; i < defaultIndexes.count; ++i) { + C::iterator it = compositor.find(C::Default, i); + QCOMPARE(it->list, defaultLists[i]); + if (defaultLists[i]) + QCOMPARE(it.modelIndex(), defaultIndexes[i]); + } + QCOMPARE(compositor.count(Visible), visibleIndexes.count); + for (int i = 0; i < visibleIndexes.count; ++i) { + C::iterator it = compositor.find(Visible, i); + QCOMPARE(it->list, visibleLists[i]); + if (visibleLists[i]) + QCOMPARE(it.modelIndex(), visibleIndexes[i]); + } + QCOMPARE(compositor.count(Selection), selectionIndexes.count); + for (int i = 0; i < selectionIndexes.count; ++i) { + C::iterator it = compositor.find(Selection, i); + QCOMPARE(it->list, selectionLists[i]); + if (selectionLists[i]) + QCOMPARE(it.modelIndex(), selectionIndexes[i]); + } +} + +void tst_qqmllistcompositor::setFlags_data() +{ + QTest::addColumn("ranges"); + QTest::addColumn("group"); + QTest::addColumn("index"); + QTest::addColumn("count"); + QTest::addColumn("flags"); + QTest::addColumn("expectedInserts"); + QTest::addColumn("cacheIndexes"); + QTest::addColumn("cacheLists"); + QTest::addColumn("defaultIndexes"); + QTest::addColumn("defaultLists"); + QTest::addColumn("visibleIndexes"); + QTest::addColumn("visibleLists"); + QTest::addColumn("selectionIndexes"); + QTest::addColumn("selectionLists"); + + int listA; void *a = &listA; + + { static const int cacheIndexes[] = {0,0,0,0}; + static const void *cacheLists[] = {0,0,0,0}; + static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; + QTest::newRow("Default, 2, 2, Default") + << (RangeList() + << Range(a, 0, 12, C::DefaultFlag) + << Range(0, 0, 4, C::CacheFlag)) + << C::Default << 2 << 2 << int(C::DefaultFlag) + << (InsertList()) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray() << ListArray() + << IndexArray() << ListArray(); + } { static const int cacheIndexes[] = {0,0,0,0}; + static const void *cacheLists[] = {0,0,0,0}; + static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; + static const int visibleIndexes[] = {2,3}; + static const void *visibleLists[] = {a,a}; + QTest::newRow("Default, 2, 2, Visible") + << (RangeList() + << Range(a, 0, 12, C::DefaultFlag) + << Range(0, 0, 4, C::CacheFlag)) + << C::Default << 2 << 2 << int(VisibleFlag) + << (InsertList() + << Insert(0, 0, 2, 0, 2, VisibleFlag)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray(visibleIndexes) << ListArray(visibleLists) + << IndexArray() << ListArray(); + } { static const int cacheIndexes[] = {3,6,0,0,0,0}; + static const void *cacheLists[] = {a,a,0,0,0,0}; + static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; + static const int visibleIndexes[] = {2,3,6,7}; + static const void *visibleLists[] = {a,a,a,a}; + static const int selectionIndexes[] = {3,6}; + static const void *selectionLists[] = {a,a}; + QTest::newRow("Visible, 1, 2, Selection | Cache") + << (RangeList() + << Range(a, 0, 2, C::DefaultFlag) + << Range(a, 2, 2, VisibleFlag | C::DefaultFlag) + << Range(a, 4, 2, C::DefaultFlag) + << Range(a, 6, 2, VisibleFlag | C::DefaultFlag) + << Range(a, 8, 4, C::DefaultFlag) + << Range(0, 0, 4, C::CacheFlag)) + << Visible << 1 << 2 << int(SelectionFlag | C::CacheFlag) + << (InsertList() + << Insert(0, 1, 3, 0, 1, SelectionFlag | C::CacheFlag) + << Insert(1, 2, 6, 1, 1, SelectionFlag | C::CacheFlag)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray(visibleIndexes) << ListArray(visibleLists) + << IndexArray(selectionIndexes) << ListArray(selectionLists); + } { static const int cacheIndexes[] = {3,6,0,0,0,0}; + static const void *cacheLists[] = {a,a,0,0,0,0}; + static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; + static const int visibleIndexes[] = {2,3,6,7,0}; + static const void *visibleLists[] = {a,a,a,a,0}; + static const int selectionIndexes[] = {3,6}; + static const void *selectionLists[] = {a,a}; + QTest::newRow("Cache, 3, 1, Visible") + << (RangeList() + << Range(a, 0, 2, C::DefaultFlag) + << Range(a, 2, 1, VisibleFlag | C::DefaultFlag) + << Range(a, 3, 1, SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 4, 2, C::DefaultFlag) + << Range(a, 6, 1, SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 7, 1, VisibleFlag | C::DefaultFlag) + << Range(a, 8, 4, C::DefaultFlag) + << Range(0, 0, 4, C::CacheFlag)) + << C::Cache << 3 << 1 << int(VisibleFlag) + << (InsertList() + << Insert(2, 4, 12, 3, 1, VisibleFlag | C::CacheFlag)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray(visibleIndexes) << ListArray(visibleLists) + << IndexArray(selectionIndexes) << ListArray(selectionLists); + } { static const int cacheIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; + static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; + static const int visibleIndexes[] = {0,1,3,4,5,6,7,8,9,10,11}; + static const void *visibleLists[] = {a,a,a,a,a,a,a,a,a, a, a}; + static const int selectionIndexes[] = {2,6,7,8,9}; + static const void *selectionLists[] = {a,a,a,a,a}; + QTest::newRow("Existing flag, sparse selection") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 2, 1, C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 3, 3, C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 6, 4, C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) + << Range(a,10, 2, C::AppendFlag | C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) + << C::Cache << 3 << 1 << int(VisibleFlag) + << InsertList() + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray(visibleIndexes) << ListArray(visibleLists) + << IndexArray(selectionIndexes) << ListArray(selectionLists); + } +} + +void tst_qqmllistcompositor::setFlags() +{ + QFETCH(RangeList, ranges); + QFETCH(C::Group, group); + QFETCH(int, index); + QFETCH(int, count); + QFETCH(int, flags); + QFETCH(InsertList, expectedInserts); + QFETCH(IndexArray, cacheIndexes); + QFETCH(ListArray, cacheLists); + QFETCH(IndexArray, defaultIndexes); + QFETCH(ListArray, defaultLists); + QFETCH(IndexArray, visibleIndexes); + QFETCH(ListArray, visibleLists); + QFETCH(IndexArray, selectionIndexes); + QFETCH(ListArray, selectionLists); + + QQmlListCompositor compositor; + compositor.setGroupCount(4); + compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); + + foreach (const Range &range, ranges) + compositor.append(range.list, range.index, range.count, range.flags); + + QVector inserts; + compositor.setFlags(group, index, count, flags, &inserts); + + QCOMPARE(inserts, expectedInserts); + + QCOMPARE(compositor.count(C::Cache), cacheIndexes.count); + for (int i = 0; i < cacheIndexes.count; ++i) { + C::iterator it = compositor.find(C::Cache, i); + QCOMPARE(it->list, cacheLists[i]); + if (cacheLists[i]) + QCOMPARE(it.modelIndex(), cacheIndexes[i]); + } + QCOMPARE(compositor.count(C::Default), defaultIndexes.count); + for (int i = 0; i < defaultIndexes.count; ++i) { + C::iterator it = compositor.find(C::Default, i); + QCOMPARE(it->list, defaultLists[i]); + if (defaultLists[i]) + QCOMPARE(it.modelIndex(), defaultIndexes[i]); + } + QCOMPARE(compositor.count(Visible), visibleIndexes.count); + for (int i = 0; i < visibleIndexes.count; ++i) { + C::iterator it = compositor.find(Visible, i); + QCOMPARE(it->list, visibleLists[i]); + if (visibleLists[i]) + QCOMPARE(it.modelIndex(), visibleIndexes[i]); + } + QCOMPARE(compositor.count(Selection), selectionIndexes.count); + for (int i = 0; i < selectionIndexes.count; ++i) { + C::iterator it = compositor.find(Selection, i); + QCOMPARE(it->list, selectionLists[i]); + if (selectionLists[i]) + QCOMPARE(it.modelIndex(), selectionIndexes[i]); + } +} + +void tst_qqmllistcompositor::move_data() +{ + QTest::addColumn("ranges"); + QTest::addColumn("fromGroup"); + QTest::addColumn("from"); + QTest::addColumn("toGroup"); + QTest::addColumn("to"); + QTest::addColumn("count"); + QTest::addColumn("expectedRemoves"); + QTest::addColumn("expectedInserts"); + QTest::addColumn("cacheIndexes"); + QTest::addColumn("cacheLists"); + QTest::addColumn("defaultIndexes"); + QTest::addColumn("defaultLists"); + QTest::addColumn("visibleIndexes"); + QTest::addColumn("visibleLists"); + QTest::addColumn("selectionIndexes"); + QTest::addColumn("selectionLists"); + + int listA; void *a = &listA; + int listB; void *b = &listB; + int listC; void *c = &listC; + + { static const int cacheIndexes[] = {0,0,0,0,2,3}; + static const void *cacheLists[] = {0,0,0,0,c,c}; + static const int defaultIndexes[] = {0,0,1,2,3,4,5,0,1,2,3,4,5,1,2,3,0,1,2,3,4,5}; + static const void *defaultLists[] = {0,a,a,a,a,a,a,b,b,b,b,b,b,0,0,0,c,c,c,c,c,c}; + QTest::newRow("15, 0, 1") + << (RangeList() + << Range(a, 0, 6, C::DefaultFlag) + << Range(b, 0, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(0, 0, 4, C::DefaultFlag | C::CacheFlag) + << Range(c, 0, 2, C::PrependFlag | C::DefaultFlag) + << Range(c, 2, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(c, 4, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag)) + << C::Default << 15 << C::Default << 0 << 1 + << (RemoveList() + << Remove(0, 0, 15, 3, 1, C::DefaultFlag | C::CacheFlag, 0)) + << (InsertList() + << Insert(0, 0, 0, 0, 1, C::DefaultFlag | C::CacheFlag, 0)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray() << ListArray() + << IndexArray() << ListArray(); + } { static const int cacheIndexes[] = {0,0,0,0,2,3}; + static const void *cacheLists[] = {0,0,0,0,c,c}; + static const int defaultIndexes[] = {0,1,0,1,2,3,4,5,0,1,2,3,4,5,2,3,0,1,2,3,4,5}; + static const void *defaultLists[] = {0,0,a,a,a,a,a,a,b,b,b,b,b,b,0,0,c,c,c,c,c,c}; + QTest::newRow("15, 1, 1") + << (RangeList() + << Range(0, 0, 1, C::DefaultFlag | C::CacheFlag) + << Range(a, 0, 6, C::DefaultFlag) + << Range(b, 0, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(0, 0, 3, C::DefaultFlag | C::CacheFlag) + << Range(c, 0, 2, C::PrependFlag | C::DefaultFlag) + << Range(c, 2, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(c, 4, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag)) + << C::Default << 15 << C::Default << 1 << 1 + << (RemoveList() + << Remove(0, 0, 15, 3, 1, C::DefaultFlag | C::CacheFlag, 0)) + << (InsertList() + << Insert(0, 0, 1, 1, 1, C::DefaultFlag | C::CacheFlag, 0)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray() << ListArray() + << IndexArray() << ListArray(); + } { static const int cacheIndexes[] = {0,0,0,0,2,3}; + static const void *cacheLists[] = {0,0,0,0,c,c}; + static const int defaultIndexes[] = {0,1,2,0,1,3,4,5,0,1,2,3,4,5,2,3,0,1,2,3,4,5}; + static const void *defaultLists[] = {a,a,a,0,0,a,a,a,b,b,b,b,b,b,0,0,c,c,c,c,c,c}; + QTest::newRow("0, 3, 2") + << (RangeList() + << Range(0, 0, 2, C::DefaultFlag | C::CacheFlag) + << Range(a, 0, 6, C::DefaultFlag) + << Range(b, 0, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(0, 0, 2, C::DefaultFlag | C::CacheFlag) + << Range(c, 0, 2, C::PrependFlag | C::DefaultFlag) + << Range(c, 2, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(c, 4, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag)) + << C::Default << 0 << C::Default << 3 << 2 + << (RemoveList() + << Remove(0, 0, 0, 0, 2, C::DefaultFlag | C::CacheFlag, 0)) + << (InsertList() + << Insert(0, 0, 3, 0, 2, C::DefaultFlag | C::CacheFlag, 0)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray() << ListArray() + << IndexArray() << ListArray(); + } { static const int cacheIndexes[] = {0,0,0,0,2,3}; + static const void *cacheLists[] = {0,0,0,0,c,c}; + static const int defaultIndexes[] = {0,5,0,1,2,3,4,5,0,1,0,1,2,2,3,3,4,1,2,3,4,5}; + static const void *defaultLists[] = {a,a,b,b,b,b,b,b,0,0,c,a,a,0,0,a,a,c,c,c,c,c}; + QTest::newRow("7, 1, 10") + << (RangeList() + << Range(a, 0, 3, C::DefaultFlag) + << Range(0, 0, 2, C::DefaultFlag | C::CacheFlag) + << Range(a, 3, 3, C::DefaultFlag) + << Range(b, 0, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(0, 0, 2, C::DefaultFlag | C::CacheFlag) + << Range(c, 0, 2, C::PrependFlag | C::DefaultFlag) + << Range(c, 2, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(c, 4, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag)) + << C::Default << 7 << C::Default << 1 << 10 + << (RemoveList() + << Remove(0, 0, 7, 2, 1, C::DefaultFlag, 0) + << Remove(0, 0, 7, 2, 6, C::DefaultFlag, 1) + << Remove(0, 0, 7, 2, 2, C::DefaultFlag | C::CacheFlag, 2) + << Remove(0, 0, 7, 2, 1, C::DefaultFlag, 3)) + << (InsertList() + << Insert(0, 0, 1, 0, 1, C::DefaultFlag, 0) + << Insert(0, 0, 2, 0, 6, C::DefaultFlag, 1) + << Insert(0, 0, 8, 0, 2, C::DefaultFlag | C::CacheFlag, 2) + << Insert(0, 0, 10, 2, 1, C::DefaultFlag, 3)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray() << ListArray() + << IndexArray() << ListArray(); + } { static const int cacheIndexes[] = {0,0,0,0,3,2}; + static const void *cacheLists[] = {0,0,0,0,c,c}; + static const int defaultIndexes[] = {0,5,0,1,2,3,4,5,0,1,0,1,2,2,3,3,4,3,4,5,1,2}; + static const void *defaultLists[] = {a,a,b,b,b,b,b,b,0,0,c,a,a,0,0,a,a,c,c,c,c,c}; + QTest::newRow("17, 20, 2") + << (RangeList() + << Range(a, 0, 1, C::DefaultFlag) + << Range(a, 5, 1, C::DefaultFlag) + << Range(b, 0, 6, C::DefaultFlag) + << Range(0, 0, 2, C::DefaultFlag | C::CacheFlag) + << Range(c, 0, 1, C::DefaultFlag) + << Range(a, 1, 2, C::DefaultFlag) + << Range(0, 0, 2, C::DefaultFlag | C::CacheFlag) + << Range(a, 3, 2, C::DefaultFlag) + << Range(b, 0, 6, C::AppendFlag | C::PrependFlag) + << Range(c, 0, 1, C::PrependFlag) + << Range(c, 1, 1, C::PrependFlag | C::DefaultFlag) + << Range(c, 2, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(c, 4, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag)) + << C::Default << 17 << C::Default << 20 << 2 + << (RemoveList() + << Remove(0, 0, 17, 4, 1, C::DefaultFlag, 0) + << Remove(0, 0, 17, 4, 1, C::DefaultFlag | C::CacheFlag, 1)) + << (InsertList() + << Insert(0, 0, 20, 5, 1, C::DefaultFlag, 0) + << Insert(0, 0, 21, 5, 1, C::DefaultFlag | C::CacheFlag, 1)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray() << ListArray() + << IndexArray() << ListArray(); + } { static const int cacheIndexes[] = {8,9,10,4,11,0,1,2,3,5,6,7}; + static const void *cacheLists[] = {a,a, a,a, a,a,a,a,a,a,a,a}; + static const int defaultIndexes[] = {8,9,10,4,11,0,1,2,3,5,6,7}; + static const void *defaultLists[] = {a,a, a,a, a,a,a,a,a,a,a,a}; + static const int visibleIndexes[] = {8,9,10,4,11,0,1,2,3,5,6,7}; + static const void *visibleLists[] = {a,a, a,a, a,a,a,a,a,a,a,a}; + QTest::newRow("3, 4, 5") + << (RangeList() + << Range(a, 8, 4, VisibleFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 0, 2, C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 2, 1, C::PrependFlag) + << Range(a, 2, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 3, 5, C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 8, 4, C::AppendFlag | C::PrependFlag)) + << C::Default << 3 << C::Default << 4 << 5 + << (RemoveList() + << Remove(0, 3, 3, 3, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 0) + << Remove(0, 3, 3, 3, 2, VisibleFlag | C::DefaultFlag | C::CacheFlag, 1) + << Remove(0, 3, 3, 3, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 2) + << Remove(0, 3, 3, 3, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 3)) + << (InsertList() + << Insert(0, 4, 4, 4, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 0) + << Insert(0, 5, 5, 5, 2, VisibleFlag | C::DefaultFlag | C::CacheFlag, 1) + << Insert(0, 7, 7, 7, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 2) + << Insert(0, 8, 8, 8, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 3)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray(visibleIndexes) << ListArray(visibleLists) + << IndexArray() << ListArray(); + } { static const int cacheIndexes[] = {0,1}; + static const void *cacheLists[] = {a,a}; + static const int defaultIndexes[] = {0,1}; + static const void *defaultLists[] = {a,a}; + QTest::newRow("0, 1, 1") + << (RangeList() + << Range(a, 0, 1, C::PrependFlag) + << Range(a, 1, 1, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 2, 0, C::AppendFlag | C::PrependFlag) + << Range(a, 0, 1, C::DefaultFlag | C::CacheFlag)) + << C::Default << 0 << C::Default << 1 << 1 + << (RemoveList() + << Remove(0, 0, 0, 0, 1, C::DefaultFlag | C::CacheFlag, 0)) + << (InsertList() + << Insert(0, 0, 1, 1, 1, C::DefaultFlag | C::CacheFlag, 0)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray() << ListArray() + << IndexArray() << ListArray(); + } { static const int cacheIndexes[] = {1,2,3,4,5,6,0,8,9}; + static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a}; + static const int defaultIndexes[] = {1,2,3,4,5,6,0,8,9}; + static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a}; + static const int visibleIndexes[] = {0,7,10}; + static const void *visibleLists[] = {a,a, a}; + QTest::newRow("0, 6, 3") + << (RangeList() + << Range(a, 0, 1, C::PrependFlag) + << Range(a, 1, 6, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 0, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 7, 1, VisibleFlag) + << Range(a,10, 1, VisibleFlag) + << Range(a, 7, 1, C::PrependFlag) + << Range(a, 8, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) + << Visible << 0 << C::Default << 6 << 3 + << (RemoveList() + << Remove(0, 0, 6, 6, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 0) + << Remove(0, 0, 6, 6, 1, VisibleFlag, 1) + << Remove(0, 0, 6, 6, 1, VisibleFlag, 2)) + << (InsertList() + << Insert(0, 0, 6, 6, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 0) + << Insert(0, 1, 7, 7, 1, VisibleFlag, 1) + << Insert(0, 2, 7, 7, 1, VisibleFlag, 2)) + << IndexArray(cacheIndexes) << ListArray(cacheLists) + << IndexArray(defaultIndexes) << ListArray(defaultLists) + << IndexArray(visibleIndexes) << ListArray(visibleLists) + << IndexArray() << ListArray(); + } +} + +void tst_qqmllistcompositor::move() +{ + QFETCH(RangeList, ranges); + QFETCH(C::Group, fromGroup); + QFETCH(int, from); + QFETCH(C::Group, toGroup); + QFETCH(int, to); + QFETCH(int, count); + QFETCH(RemoveList, expectedRemoves); + QFETCH(InsertList, expectedInserts); + QFETCH(IndexArray, cacheIndexes); + QFETCH(ListArray, cacheLists); + QFETCH(IndexArray, defaultIndexes); + QFETCH(ListArray, defaultLists); + QFETCH(IndexArray, visibleIndexes); + QFETCH(ListArray, visibleLists); + QFETCH(IndexArray, selectionIndexes); + QFETCH(ListArray, selectionLists); + + QQmlListCompositor compositor; + compositor.setGroupCount(4); + compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); + + foreach (const Range &range, ranges) + compositor.append(range.list, range.index, range.count, range.flags); + + QVector removes; + QVector inserts; + compositor.move(fromGroup, from, toGroup, to, count, fromGroup, &removes, &inserts); + + QCOMPARE(removes, expectedRemoves); + QCOMPARE(inserts, expectedInserts); + + QCOMPARE(compositor.count(C::Cache), cacheIndexes.count); + for (int i = 0; i < cacheIndexes.count; ++i) { + C::iterator it = compositor.find(C::Cache, i); + QCOMPARE(it->list, cacheLists[i]); + if (cacheLists[i]) + QCOMPARE(it.modelIndex(), cacheIndexes[i]); + } + QCOMPARE(compositor.count(C::Default), defaultIndexes.count); + for (int i = 0; i < defaultIndexes.count; ++i) { + C::iterator it = compositor.find(C::Default, i); + QCOMPARE(it->list, defaultLists[i]); + if (defaultLists[i]) + QCOMPARE(it.modelIndex(), defaultIndexes[i]); + } + QCOMPARE(compositor.count(Visible), visibleIndexes.count); + for (int i = 0; i < visibleIndexes.count; ++i) { + C::iterator it = compositor.find(Visible, i); + QCOMPARE(it->list, visibleLists[i]); + if (visibleLists[i]) + QCOMPARE(it.modelIndex(), visibleIndexes[i]); + } + QCOMPARE(compositor.count(Selection), selectionIndexes.count); + for (int i = 0; i < selectionIndexes.count; ++i) { + C::iterator it = compositor.find(Selection, i); + QCOMPARE(it->list, selectionLists[i]); + if (selectionLists[i]) + QCOMPARE(it.modelIndex(), selectionIndexes[i]); + } +} + +void tst_qqmllistcompositor::moveFromEnd() +{ + int listA; void *a = &listA; + + QQmlListCompositor compositor; + compositor.append(a, 0, 1, C::AppendFlag | C::PrependFlag | C::DefaultFlag); + + // Moving an item anchors it to that position. + compositor.move(C::Default, 0, C::Default, 0, 1, C::Default); + + // The existing item is anchored at 0 so prepending an item to the source will append it here + QVector inserts; + compositor.listItemsInserted(a, 0, 1, &inserts); + + QCOMPARE(inserts.count(), 1); + QCOMPARE(inserts.at(0).index[1], 1); + QCOMPARE(inserts.at(0).count, 1); + + C::iterator it; + it = compositor.find(C::Default, 0); + QCOMPARE(it.modelIndex(), 1); + + it = compositor.find(C::Default, 1); + QCOMPARE(it.modelIndex(), 0); +} + +void tst_qqmllistcompositor::clear() +{ + QQmlListCompositor compositor; + compositor.setGroupCount(4); + compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); + + int listA; void *a = &listA; + int listB; void *b = &listB; + + compositor.append(a, 0, 8, C::AppendFlag | C::PrependFlag | VisibleFlag | C::DefaultFlag); + compositor.append(b, 4, 5, VisibleFlag | C::DefaultFlag); + compositor.append(0, 0, 3, VisibleFlag | C::DefaultFlag | C::CacheFlag); + + QCOMPARE(compositor.count(C::Default), 16); + QCOMPARE(compositor.count(Visible), 16); + QCOMPARE(compositor.count(C::Cache), 3); + + compositor.clear(); + QCOMPARE(compositor.count(C::Default), 0); + QCOMPARE(compositor.count(Visible), 0); + QCOMPARE(compositor.count(C::Cache), 0); +} + +void tst_qqmllistcompositor::listItemsInserted_data() +{ + QTest::addColumn("ranges"); + QTest::addColumn("list"); + QTest::addColumn("index"); + QTest::addColumn("count"); + QTest::addColumn("expectedInserts"); + QTest::addColumn("cacheIndexes"); + QTest::addColumn("defaultIndexes"); + QTest::addColumn("visibleIndexes"); + QTest::addColumn("selectionIndexes"); + + int listA; void *a = &listA; + int listB; void *b = &listB; + + { static const int defaultIndexes[] = {/*A*/0,1,5,6,/*B*/0,1,2,3,/*A*/2,3,4}; + QTest::newRow("A 10, 2") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) + << Range(a, 2, 3, C::PrependFlag) + << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(b, 0, 4, C::DefaultFlag) + << Range(a, 2, 3, C::DefaultFlag)) + << a << 10 << 2 + << InsertList() + << IndexArray() + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(); + } { static const int defaultIndexes[] = {/*A*/0,1,5,6,/*B*/0,1,2,3,/*A*/2,3,4}; + QTest::newRow("B 10, 2") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) + << Range(a, 2, 3, C::PrependFlag) + << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(b, 0, 4, C::DefaultFlag) + << Range(a, 2, 3, C::DefaultFlag)) + << b << 10 << 2 + << InsertList() + << IndexArray() + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(); + } { static const int defaultIndexes[] = {/*A*/0,1,2,3,7,8,/*B*/0,1,2,3,/*A*/4,5,6}; + static const int visibleIndexes[] = {/*A*/0,1}; + QTest::newRow("A 0, 2") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) + << Range(a, 2, 3, C::PrependFlag) + << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(b, 0, 4, C::DefaultFlag) + << Range(a, 2, 3, C::DefaultFlag)) + << a << 0 << 2 + << (InsertList() + << Insert(0, 0, 0, 0, 2, VisibleFlag | C::DefaultFlag)) + << IndexArray() + << IndexArray(defaultIndexes) + << IndexArray(visibleIndexes) + << IndexArray(); + } { static const int defaultIndexes[] = {/*A*/0,1,2,3,5,8,9,/*B*/0,1,2,3,/*A*/4,6,7}; + static const int visibleIndexes[] = {/*A*/0,1,5}; + QTest::newRow("A 5, 1") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | VisibleFlag | C::DefaultFlag) + << Range(a, 2, 2, C::PrependFlag | C::DefaultFlag) + << Range(a, 4, 3, C::PrependFlag) + << Range(a, 7, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(b, 0, 4, C::DefaultFlag) + << Range(a, 4, 3, C::DefaultFlag)) + << a << 5 << 1 + << (InsertList() + << Insert(0, 2, 4, 0, 1, VisibleFlag | C::DefaultFlag)) + << IndexArray() + << IndexArray(defaultIndexes) + << IndexArray(visibleIndexes) + << IndexArray(); + } { static const int defaultIndexes[] = {/*A*/0,1,2,3,5,8,9,10,11,/*B*/0,1,2,3,/*A*/4,6,7}; + static const int visibleIndexes[] = {/*A*/0,1,5,10,11}; + QTest::newRow("A 10, 2") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | VisibleFlag | C::DefaultFlag) + << Range(a, 2, 2, C::PrependFlag | C::DefaultFlag) + << Range(a, 4, 1, C::PrependFlag) + << Range(a, 5, 1, C::PrependFlag | VisibleFlag | C::DefaultFlag) + << Range(a, 6, 2, C::PrependFlag) + << Range(a, 8, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(b, 0, 4, C::DefaultFlag) + << Range(a, 4, 1, C::DefaultFlag) + << Range(a, 6, 2, C::DefaultFlag)) + << a << 10 << 2 + << (InsertList() + << Insert(0, 3, 7, 0, 2, VisibleFlag | C::DefaultFlag)) + << IndexArray() + << IndexArray(defaultIndexes) + << IndexArray(visibleIndexes) + << IndexArray(); + } { static const int cacheIndexes[] = {/*A*/0,1,-1,-1,-1,2,5,6,7,8,9}; + static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6,7,8,9}; + static const int visibleIndexes[] = {/*A*/3,4}; + QTest::newRow("Insert after remove") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 2, 3, C::CacheFlag) + << Range(a, 2, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) + << a << 3 << 2 + << (InsertList() + << Insert(0, 0, 3, 6, 2, VisibleFlag | C::DefaultFlag)) + << IndexArray(cacheIndexes) + << IndexArray(defaultIndexes) + << IndexArray(visibleIndexes) + << IndexArray(); + } { static const int cacheIndexes[] = {/*A*/0,1,2,3,4}; + static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6}; + static const int visibleIndexes[] = {/*A*/0,1,2,3,4,5,6}; + QTest::newRow("Consecutive appends") + << (RangeList() + << Range(a, 0, 5, C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 5, 1, C::PrependFlag | VisibleFlag | C::DefaultFlag) + << Range(a, 6, 0, C::AppendFlag | VisibleFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) + << a << 6 << 1 + << (InsertList() + << Insert(0, 6, 6, 5, 1, VisibleFlag | C::DefaultFlag)) + << IndexArray(cacheIndexes) + << IndexArray(defaultIndexes) + << IndexArray(visibleIndexes) + << IndexArray(); + } +} + +void tst_qqmllistcompositor::listItemsInserted() +{ + QFETCH(RangeList, ranges); + QFETCH(void *, list); + QFETCH(int, index); + QFETCH(int, count); + QFETCH(InsertList, expectedInserts); + QFETCH(IndexArray, cacheIndexes); + QFETCH(IndexArray, defaultIndexes); + QFETCH(IndexArray, visibleIndexes); + QFETCH(IndexArray, selectionIndexes); + + QQmlListCompositor compositor; + compositor.setGroupCount(4); + compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); + + foreach (const Range &range, ranges) + compositor.append(range.list, range.index, range.count, range.flags); + + QVector inserts; + compositor.listItemsInserted(list, index, count, &inserts); + + QCOMPARE(inserts, expectedInserts); + + QCOMPARE(compositor.count(C::Cache), cacheIndexes.count); + for (int i = 0; i < cacheIndexes.count; ++i) { + if (cacheIndexes[i] != -1) { + QCOMPARE(compositor.find(C::Cache, i).modelIndex(), cacheIndexes[i]); + } + } + QCOMPARE(compositor.count(C::Default), defaultIndexes.count); + for (int i = 0; i < defaultIndexes.count; ++i) { + if (defaultIndexes[i] != -1) { + QCOMPARE(compositor.find(C::Default, i).modelIndex(), defaultIndexes[i]); + } + } + QCOMPARE(compositor.count(Visible), visibleIndexes.count); + for (int i = 0; i < visibleIndexes.count; ++i) { + if (visibleIndexes[i] != -1) { + QCOMPARE(compositor.find(Visible, i).modelIndex(), visibleIndexes[i]); + } + } + QCOMPARE(compositor.count(Selection), selectionIndexes.count); + for (int i = 0; i < selectionIndexes.count; ++i) { + if (selectionIndexes[i] != -1) { + QCOMPARE(compositor.find(Selection, i).modelIndex(), selectionIndexes[i]); + } + } +} + +void tst_qqmllistcompositor::listItemsRemoved_data() +{ + QTest::addColumn("ranges"); + QTest::addColumn("list"); + QTest::addColumn("index"); + QTest::addColumn("count"); + QTest::addColumn("expectedRemoves"); + QTest::addColumn("cacheIndexes"); + QTest::addColumn("defaultIndexes"); + QTest::addColumn("visibleIndexes"); + QTest::addColumn("selectionIndexes"); + + int listA; void *a = &listA; + int listB; void *b = &listB; + + { static const int defaultIndexes[] = {/*A*/0,1,5,6,/*B*/0,1,2,3,/*A*/2,3,4}; + QTest::newRow("12, 2") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) + << Range(a, 2, 3, C::PrependFlag) + << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(b, 0, 4, C::DefaultFlag) + << Range(a, 2, 3, C::DefaultFlag)) + << a << 12 << 2 + << RemoveList() + << IndexArray() + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(); + } { static const int defaultIndexes[] = {/*A*/0,1,/*B*/0,1,2,3,/*A*/2,3}; + QTest::newRow("4, 3") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) + << Range(a, 2, 3, C::PrependFlag) + << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(b, 0, 4, C::DefaultFlag) + << Range(a, 2, 3, C::DefaultFlag)) + << a << 4 << 3 + << (RemoveList() + << Remove(0, 0, 2, 0, 2, C::DefaultFlag) + << Remove(0, 0, 8, 0, 1, C::DefaultFlag)) + << IndexArray() + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(); + } { static const int cacheIndexes[] = {/*A*/0,1,-1,-1,-1,2,-1,-1,3,4,5}; + static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5}; + QTest::newRow("Remove after remove") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 2, 3, C::CacheFlag) + << Range(a, 2, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) + << a << 3 << 2 + << (RemoveList() + << Remove(0, 0, 3, 6, 2, C::DefaultFlag | C::CacheFlag)) + << IndexArray(cacheIndexes) + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(); + } { static const int cacheIndexes[] = {/*A*/-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1}; + static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6}; + QTest::newRow("Sparse remove") + << (RangeList() + << Range(a, 0, 2, C::CacheFlag) + << Range(a, 0, 1, C::DefaultFlag | C::CacheFlag) + << Range(a, 0, 1, C::CacheFlag) + << Range(a, 1, 5, C::DefaultFlag | C::CacheFlag) + << Range(a, 0, 1, C::CacheFlag) + << Range(a, 6, 2, C::DefaultFlag | C::CacheFlag) + << Range(a, 0, 1, C::CacheFlag) + << Range(a, 8, 3, C::DefaultFlag | C::CacheFlag) + << Range(a, 0, 1, C::CacheFlag) + << Range(a, 11, 1, C::DefaultFlag | C::CacheFlag) + << Range(a, 12, 5, C::DefaultFlag)) + << a << 1 << 10 + << (RemoveList() + << Remove(0, 0, 1, 4, 5, C::DefaultFlag | C::CacheFlag) + << Remove(0, 0, 1,10, 2, C::DefaultFlag | C::CacheFlag) + << Remove(0, 0, 1,13, 3, C::DefaultFlag | C::CacheFlag)) + << IndexArray(cacheIndexes) + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(); + } +} + +void tst_qqmllistcompositor::listItemsRemoved() +{ + QFETCH(RangeList, ranges); + QFETCH(void *, list); + QFETCH(int, index); + QFETCH(int, count); + QFETCH(RemoveList, expectedRemoves); + QFETCH(IndexArray, cacheIndexes); + QFETCH(IndexArray, defaultIndexes); + QFETCH(IndexArray, visibleIndexes); + QFETCH(IndexArray, selectionIndexes); + + QQmlListCompositor compositor; + compositor.setGroupCount(4); + compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); + + foreach (const Range &range, ranges) + compositor.append(range.list, range.index, range.count, range.flags); + + QVector removes; + compositor.listItemsRemoved(list, index, count, &removes); + + QCOMPARE(removes, expectedRemoves); + + QCOMPARE(compositor.count(C::Cache), cacheIndexes.count); + for (int i = 0; i < cacheIndexes.count; ++i) { + if (cacheIndexes[i] != -1) { + QCOMPARE(compositor.find(C::Cache, i).modelIndex(), cacheIndexes[i]); + } + } + QCOMPARE(compositor.count(C::Default), defaultIndexes.count); + for (int i = 0; i < defaultIndexes.count; ++i) { + if (defaultIndexes[i] != -1) { + QCOMPARE(compositor.find(C::Default, i).modelIndex(), defaultIndexes[i]); + } + } + QCOMPARE(compositor.count(Visible), visibleIndexes.count); + for (int i = 0; i < visibleIndexes.count; ++i) { + if (visibleIndexes[i] != -1) { + QCOMPARE(compositor.find(Visible, i).modelIndex(), visibleIndexes[i]); + } + } + QCOMPARE(compositor.count(Selection), selectionIndexes.count); + for (int i = 0; i < selectionIndexes.count; ++i) { + if (selectionIndexes[i] != -1) { + QCOMPARE(compositor.find(Selection, i).modelIndex(), selectionIndexes[i]); + } + } +} + +void tst_qqmllistcompositor::listItemsMoved_data() +{ + QTest::addColumn("ranges"); + QTest::addColumn("list"); + QTest::addColumn("from"); + QTest::addColumn("to"); + QTest::addColumn("count"); + QTest::addColumn("expectedRemoves"); + QTest::addColumn("expectedInserts"); + QTest::addColumn("cacheIndexes"); + QTest::addColumn("defaultIndexes"); + QTest::addColumn("visibleIndexes"); + QTest::addColumn("selectionIndexes"); + + int listA; void *a = &listA; + int listB; void *b = &listB; + + { static const int defaultIndexes[] = {/*A*/0,2,3,4,/*B*/0,1,2,3,/*A*/5,6,1}; + QTest::newRow("4, 1, 3") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) + << Range(a, 2, 3, C::PrependFlag) + << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(b, 0, 4, C::DefaultFlag) + << Range(a, 2, 3, C::DefaultFlag)) + << a << 4 << 1 << 3 + << (RemoveList() + << Remove(0, 0, 2, 0, 2, C::DefaultFlag, 0)) + << (InsertList() + << Insert(0, 0, 1, 0, 2, C::DefaultFlag, 0)) + << IndexArray() + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(); + } { static const int defaultIndexes[] = {/*A*/1,2,3,6,/*B*/0,1,2,3,/*A*/4,5,0}; + QTest::newRow("0, 6, 1") + << (RangeList() + << Range(a, 0, 1, C::PrependFlag | C::DefaultFlag) + << Range(a, 1, 1, C::PrependFlag) + << Range(a, 2, 3, C::PrependFlag | C::DefaultFlag) + << Range(a, 5, 2, C::PrependFlag) + << Range(a, 7, 0, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(b, 0, 4, C::DefaultFlag) + << Range(a, 5, 2, C::DefaultFlag) + << Range(a, 1, 1, C::DefaultFlag)) + << a << 0 << 6 << 1 + << (RemoveList() + << Remove(0, 0, 0, 0, 1, C::DefaultFlag, 0)) + << (InsertList() + << Insert(0, 0, 3, 0, 1, C::DefaultFlag, 0)) + << IndexArray() + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(); + } { static const int cacheIndexes[] = {/*A*/0,1,3,4}; + static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6,7}; + QTest::newRow("6, 2, 1") + << (RangeList() + << Range(a, 0, 4, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 4, 4, C::AppendFlag | C::PrependFlag | C::DefaultFlag)) + << a << 6 << 2 << 1 + << (RemoveList() + << Remove(0, 0, 6, 4, 1, C::DefaultFlag, 0)) + << (InsertList() + << Insert(0, 0, 2, 2, 1, C::DefaultFlag, 0)) + << IndexArray(cacheIndexes) + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(); + } { static const int cacheIndexes[] = {/*A*/0,1,-1,-1,-1,2,3,4,5,6,7}; + static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6,7}; + QTest::newRow("Move after remove") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 2, 3, C::CacheFlag) + << Range(a, 2, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) + << a << 4 << 2 << 2 + << (RemoveList() + << Remove(0, 0, 4, 7, 2, C::DefaultFlag | C::CacheFlag, 0)) + << (InsertList() + << Insert(0, 0, 2, 5, 2, C::DefaultFlag | C::CacheFlag, 0)) + << IndexArray(cacheIndexes) + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(); + } { static const int cacheIndexes[] = {/*A*/0,1,5,6,7,8,9,10,11,12}; + static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6,7,8,9,10,11,12}; + QTest::newRow("Move merge tail") + << (RangeList() + << Range(a, 0, 10, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 10, 3, C::PrependFlag | C::DefaultFlag) + << Range(a, 13, 0, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) + << a << 8 << 0 << 5 + << (RemoveList() + << Remove(0, 0, 8, 8, 2, C::DefaultFlag | C::CacheFlag, 0) + << Remove(0, 0, 8, 8, 3, C::DefaultFlag, 1)) + << (InsertList() + << Insert(0, 0, 0, 0, 2, C::DefaultFlag | C::CacheFlag, 0) + << Insert(0, 0, 2, 2, 3, C::DefaultFlag, 1)) + << IndexArray(cacheIndexes) + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(); + } { static const int cacheIndexes[] = {/*A*/0,1,2,3}; + static const int defaultIndexes[] = {/*A*/0,1,2,3}; + static const int selectionIndexes[] = {/*A*/3}; + QTest::newRow("Move selection") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 2, 1, C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 3, 1, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) + << a << 2 << 3 << 1 + << (RemoveList() + << Remove(0, 0, 2, 2, 1, C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag, 0)) + << (InsertList() + << Insert(0, 0, 3, 3, 1, C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag, 0)) + << IndexArray(cacheIndexes) + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(selectionIndexes); + } { static const int cacheIndexes[] = {/*A*/0,1,2,3,4,5,8,9}; + static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6,7,8,9,10,11}; + QTest::newRow("move mixed cached items") + << (RangeList() + << Range(a, 0, 1, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 1, 2, C::PrependFlag | C::DefaultFlag) + << Range(a, 3, 7, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 10, 2, C::PrependFlag | C::DefaultFlag)) + << a << 1 << 6 << 3 + << (RemoveList() + << Remove(0, 0, 1, 1, 2, C::PrependFlag | C::DefaultFlag, 0) + << Remove(0, 0, 1, 1, 1, C::PrependFlag | C::DefaultFlag | C::CacheFlag, 1)) + << (InsertList() + << Insert(0, 0, 6, 6, 2, C::PrependFlag | C::DefaultFlag, 0) + << Insert(0, 0, 8, 6, 1, C::PrependFlag | C::DefaultFlag | C::CacheFlag, 1)) + << IndexArray(cacheIndexes) + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(); + } +} + +void tst_qqmllistcompositor::listItemsMoved() +{ + QFETCH(RangeList, ranges); + QFETCH(void *, list); + QFETCH(int, from); + QFETCH(int, to); + QFETCH(int, count); + QFETCH(RemoveList, expectedRemoves); + QFETCH(InsertList, expectedInserts); + QFETCH(IndexArray, cacheIndexes); + QFETCH(IndexArray, defaultIndexes); + QFETCH(IndexArray, visibleIndexes); + QFETCH(IndexArray, selectionIndexes); + + QQmlListCompositor compositor; + compositor.setGroupCount(4); + compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); + + foreach (const Range &range, ranges) + compositor.append(range.list, range.index, range.count, range.flags); + + QVector removes; + QVector inserts; + compositor.listItemsMoved(list, from, to, count, &removes, &inserts); + + QCOMPARE(removes, expectedRemoves); + QCOMPARE(inserts, expectedInserts); + + QCOMPARE(compositor.count(C::Cache), cacheIndexes.count); + for (int i = 0; i < cacheIndexes.count; ++i) { + if (cacheIndexes[i] != -1) { + QCOMPARE(compositor.find(C::Cache, i).modelIndex(), cacheIndexes[i]); + } + } + QCOMPARE(compositor.count(C::Default), defaultIndexes.count); + for (int i = 0; i < defaultIndexes.count; ++i) { + if (defaultIndexes[i] != -1) { + QCOMPARE(compositor.find(C::Default, i).modelIndex(), defaultIndexes[i]); + } + } + QCOMPARE(compositor.count(Visible), visibleIndexes.count); + for (int i = 0; i < visibleIndexes.count; ++i) { + if (visibleIndexes[i] != -1) { + QCOMPARE(compositor.find(Visible, i).modelIndex(), visibleIndexes[i]); + } + } + QCOMPARE(compositor.count(Selection), selectionIndexes.count); + for (int i = 0; i < selectionIndexes.count; ++i) { + if (selectionIndexes[i] != -1) { + QCOMPARE(compositor.find(Selection, i).modelIndex(), selectionIndexes[i]); + } + } +} + +void tst_qqmllistcompositor::listItemsChanged_data() +{ + QTest::addColumn("ranges"); + QTest::addColumn("list"); + QTest::addColumn("index"); + QTest::addColumn("count"); + QTest::addColumn("expectedChanges"); + + int listA; void *a = &listA; + int listB; void *b = &listB; + + QTest::newRow("overlapping") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) + << Range(a, 2, 3, C::PrependFlag) + << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) + << Range(b, 0, 4, C::DefaultFlag) + << Range(a, 2, 3, C::DefaultFlag)) + << a << 3 << 4 + << (ChangeList() + << Change(0, 0, 2, 0, 2, C::DefaultFlag) + << Change(0, 0, 9, 0, 2, C::DefaultFlag)); + QTest::newRow("Change after remove") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 2, 3, C::CacheFlag) + << Range(a, 2, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) + << a << 3 << 2 + << (ChangeList() + << Change(0, 0, 3, 6, 2, C::DefaultFlag | C::CacheFlag)); +} + +void tst_qqmllistcompositor::listItemsChanged() +{ + QFETCH(RangeList, ranges); + QFETCH(void *, list); + QFETCH(int, index); + QFETCH(int, count); + QFETCH(ChangeList, expectedChanges); + + QQmlListCompositor compositor; + compositor.setGroupCount(4); + compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); + + foreach (const Range &range, ranges) + compositor.append(range.list, range.index, range.count, range.flags); + + QVector changes; + compositor.listItemsChanged(list, index, count, &changes); + + QCOMPARE(changes, expectedChanges); +} + +void tst_qqmllistcompositor::compositorDebug() +{ + void *a = (void *)0xa0; + void *b = (void *)0xb0; + + QQmlListCompositor compositor; + compositor.setGroupCount(4); + compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); + compositor.append(a, 0, 2, C::PrependFlag | C::DefaultFlag); + compositor.append(a, 2, 3, C::PrependFlag); + compositor.append(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag); + compositor.append(b, 0, 4, C::DefaultFlag); + compositor.append(a, 2, 3, C::DefaultFlag); + + QTest::ignoreMessage(QtDebugMsg, + "QQmlListCompositor(00110\n" + " 0 0 0 0 Range(0xa0 0 2 00P000000000D0\n" + " 0 0 2 0 Range(0xa0 2 3 00P00000000000\n" + " 0 0 2 0 Range(0xa0 5 2 0AP000000000D0\n" + " 0 0 4 0 Range(0xb0 0 4 000000000000D0\n" + " 0 0 8 0 Range(0xa0 2 3 000000000000D0)"); + qDebug() << compositor; + + compositor.setFlags(C::Default, 5, 2, SelectionFlag); + + QTest::ignoreMessage(QtDebugMsg, + "QQmlListCompositor(20110\n" + " 0 0 0 0 Range(0xa0 0 2 00P000000000D0\n" + " 0 0 2 0 Range(0xa0 2 3 00P00000000000\n" + " 0 0 2 0 Range(0xa0 5 2 0AP000000000D0\n" + " 0 0 4 0 Range(0xb0 0 1 000000000000D0\n" + " 0 0 5 0 Range(0xb0 1 2 000000000010D0\n" + " 2 0 7 0 Range(0xb0 3 1 000000000000D0\n" + " 2 0 8 0 Range(0xa0 2 3 000000000000D0)"); + qDebug() << compositor; +} + +void tst_qqmllistcompositor::changeDebug() +{ + void *a = (void *)0xa0; + void *b = (void *)0xb0; + + QQmlListCompositor compositor; + compositor.setGroupCount(4); + compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); + compositor.append(a, 0, 2, C::PrependFlag | C::DefaultFlag); + compositor.append(a, 2, 3, C::PrependFlag); + compositor.append(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag); + compositor.append(b, 0, 1, C::DefaultFlag); + compositor.append(b, 1, 2, SelectionFlag | C::DefaultFlag); + compositor.append(b, 3, 1, C::DefaultFlag); + compositor.append(a, 2, 3, C::DefaultFlag); + + + QTest::ignoreMessage(QtDebugMsg, "Change(-1 2 000000010D0 2 0 7 0)"); + qDebug() << QQmlListCompositor::Change(compositor.find(C::Default, 7), 2, SelectionFlag | C::DefaultFlag); + QTest::ignoreMessage(QtDebugMsg, "Remove(9 4 000000000D0 10 0)"); + qDebug() << QQmlListCompositor::Remove(compositor.find(C::Default, 10), 4, C::DefaultFlag, 9); + QTest::ignoreMessage(QtDebugMsg, "Insert(9 4 000000000D0 3 0)"); + qDebug() << QQmlListCompositor::Insert(compositor.find(C::Default, 3), 4, C::DefaultFlag, 9); +} + +void tst_qqmllistcompositor::groupDebug() +{ + QTest::ignoreMessage(QtDebugMsg, "Default "); + qDebug() << C::Default; + QTest::ignoreMessage(QtDebugMsg, "Cache "); + qDebug() << C::Cache; + QTest::ignoreMessage(QtDebugMsg, "Group3 "); + qDebug() << Selection; +} + +QTEST_MAIN(tst_qqmllistcompositor) + +#include "tst_qqmllistcompositor.moc" + + diff --git a/tests/auto/qml/qquickchangeset/qquickchangeset.pro b/tests/auto/qml/qquickchangeset/qquickchangeset.pro deleted file mode 100644 index fd8c87baa4..0000000000 --- a/tests/auto/qml/qquickchangeset/qquickchangeset.pro +++ /dev/null @@ -1,10 +0,0 @@ -CONFIG += testcase -TARGET = tst_qquickchangeset -macx:CONFIG -= app_bundle - -SOURCES += tst_qquickchangeset.cpp - -CONFIG += parallel_test - -QT += core-private gui-private qml-private quick-private testlib -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/qml/qquickchangeset/tst_qquickchangeset.cpp b/tests/auto/qml/qquickchangeset/tst_qquickchangeset.cpp deleted file mode 100644 index 77286b04b4..0000000000 --- a/tests/auto/qml/qquickchangeset/tst_qquickchangeset.cpp +++ /dev/null @@ -1,1574 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include -#include - -class tst_qquickchangeset : public QObject -{ - Q_OBJECT -private slots: - void sequence_data(); - void sequence(); - - void apply_data(); - void apply(); - - void removeConsecutive_data(); - void removeConsecutive(); - void insertConsecutive_data(); - void insertConsecutive(); - - void copy(); - void debug(); - - // These create random sequences and verify a list with the reordered changes applied is the - // same as one with the unordered changes applied. -private: - void random_data(); - void random(); - -public: - enum { - MoveOp = 0, - InsertOp = -1, - RemoveOp = -2 - }; - - struct Signal - { - int index; - int count; - int to; - int moveId; - int offset; - - bool isInsert() const { return to == -1; } - bool isRemove() const { return to == -2; } - bool isChange() const { return to == -3; } - bool isMove() const { return to >= 0; } - }; - - static Signal Insert(int index, int count) { - Signal signal = { index, count, -1, -1, 0 }; return signal; } - static Signal Insert(int index, int count, int moveId, int moveOffset) { - Signal signal = { index, count, -1, moveId, moveOffset }; return signal; } - static Signal Remove(int index, int count) { - Signal signal = { index, count, -2, -1, 0 }; return signal; } - static Signal Remove(int index, int count, int moveId, int moveOffset) { - Signal signal = { index, count, -2, moveId, moveOffset }; return signal; } - static Signal Move(int from, int to, int count, int moveId) { - Signal signal = { from, count, to, moveId, 0 }; return signal; } - static Signal Change(int index, int count) { - Signal signal = { index, count, -3, -1, 0 }; return signal; } - - typedef QVector SignalList; - typedef QVector SignalListList; - - template - void move(int from, int to, int n, T *items) - { - if (from > to) { - // Only move forwards - flip if backwards moving - int tfrom = from; - int tto = to; - from = tto; - to = tto+n; - n = tfrom-tto; - } - - T replaced; - int i=0; - typename T::ConstIterator it=items->begin(); it += from+n; - for (; ibegin(); it += from; - for (; ibegin(); t += from; - for (; f != replaced.end(); ++f, ++t) - *t = *f; - } - - bool applyChanges(QVector &list, const QVector > &changes) - { - foreach (const SignalList &sl, changes) { - if (!applyChanges(list, sl)) - return false; - } - return true; - } - - bool applyChanges(QVector &list, const QVector &changes) - { - QHash removedValues; - foreach (const Signal &signal, changes) { - if (signal.isInsert()) { - if (signal.index < 0 || signal.index > list.count()) { - qDebug() << "insert out of range" << signal.index << list.count(); - return false; - } - if (signal.moveId != -1) { - QQuickChangeSet::Insert insert(signal.index, signal.count, signal.moveId, signal.offset); - for (int i = insert.start(); i < insert.end(); ++i) - list.insert(i, removedValues.take(insert.moveKey(i))); - } else { - list.insert(signal.index, signal.count, 100); - } - } else if (signal.isRemove()) { - if (signal.index < 0 || signal.index + signal.count > list.count()) { - qDebug() << "remove out of range" << signal.index << signal.count << list.count(); - return false; - } - if (signal.moveId != -1) { - QQuickChangeSet::Remove remove(signal.index, signal.count, signal.moveId, signal.offset); - for (int i = remove.start(); i < remove.end(); ++i) - removedValues.insert(remove.moveKey(i), list.at(i)); - } - list.erase(list.begin() + signal.index, list.begin() + signal.index + signal.count); - } else if (signal.isMove()) { - if (signal.index < 0 - || signal.to < 0 - || signal.index + signal.count > list.count() - || signal.to + signal.count > list.count()) { - qDebug() << "move out of range" << signal.index << signal.to << signal.count << list.count(); - return false; - } - move(signal.index, signal.to, signal.count, &list); - } else if (signal.isChange()) { - for (int i = signal.index; i < signal.index + signal.count; ++i) - list[i] = 100; - } - } - return true; - } - -}; - -bool operator ==(const tst_qquickchangeset::Signal &left, const tst_qquickchangeset::Signal &right) -{ - return left.index == right.index - && left.count == right.count - && left.to == right.to - && left.moveId == right.moveId - && (left.moveId == -1 || left.offset == right.offset); -} - -QT_BEGIN_NAMESPACE -bool operator ==(const QQuickChangeSet::Change &left, const QQuickChangeSet::Change &right) -{ - return left.index == right.index && left.count == right.count && left.moveId == right.moveId; -} -QT_END_NAMESPACE - -QDebug operator <<(QDebug debug, const tst_qquickchangeset::Signal &signal) -{ - if (signal.isInsert() && signal.moveId == -1) - debug.nospace() << "Insert(" << signal.index << "," << signal.count << ")"; - else if (signal.isInsert()) - debug.nospace() << "Insert(" << signal.index << "," << signal.count << "," << signal.moveId << "," << signal.offset << ")"; - else if (signal.isRemove() && signal.moveId == -1) - debug.nospace() << "Remove(" << signal.index << "," << signal.count << ")"; - else if (signal.isRemove()) - debug.nospace() << "Remove(" << signal.index << "," << signal.count << "," << signal.moveId << "," << signal.offset << ")"; - else if (signal.isMove()) - debug.nospace() << "Move(" << signal.index << "," << signal.to << "," << signal.count << "," << signal.moveId << ")"; - else if (signal.isChange()) - debug.nospace() << "Change(" << signal.index << "," << signal.count << ")"; - return debug; -} - -Q_DECLARE_METATYPE(tst_qquickchangeset::SignalList) -Q_DECLARE_METATYPE(tst_qquickchangeset::SignalListList) - -#if 0 -# define VERIFY_EXPECTED_OUTPUT \ - QVector inputList; \ - for (int i = 0; i < 40; ++i) \ - inputList.append(i); \ - QVector outputList = inputList; \ - if (!applyChanges(inputList, input)) { \ - qDebug() << input; \ - qDebug() << output; \ - qDebug() << changes; \ - QVERIFY(false); \ - } else if (!applyChanges(outputList, output)) { \ - qDebug() << input; \ - qDebug() << output; \ - qDebug() << changes; \ - QVERIFY(false); \ - } else if (outputList != inputList /* || changes != output*/) { \ - qDebug() << input; \ - qDebug() << output; \ - qDebug() << changes; \ - qDebug() << inputList; \ - qDebug() << outputList; \ - QVERIFY(false); \ - } else if (changes != output) { \ - qDebug() << output; \ - qDebug() << changes; \ - QCOMPARE(outputList, inputList); \ - } -#else -# define VERIFY_EXPECTED_OUTPUT \ - if (changes != output) { \ - qDebug() << output; \ - qDebug() << changes; \ - } -#endif - -void tst_qquickchangeset::sequence_data() -{ - QTest::addColumn("input"); - QTest::addColumn("output"); - - // Insert - QTest::newRow("i(12,5)") - << (SignalList() << Insert(12,5)) - << (SignalList() << Insert(12,5)); - QTest::newRow("i(2,3),i(12,5)") - << (SignalList() << Insert(2,3) << Insert(12,5)) - << (SignalList() << Insert(2,3) << Insert(12,5)); - QTest::newRow("i(12,5),i(2,3)") - << (SignalList() << Insert(12,5) << Insert(2,3)) - << (SignalList() << Insert(2,3) << Insert(15,5)); - QTest::newRow("i(12,5),i(12,3)") - << (SignalList() << Insert(12,5) << Insert(12,3)) - << (SignalList() << Insert(12,8)); - QTest::newRow("i(12,5),i(17,3)") - << (SignalList() << Insert(12,5) << Insert(17,3)) - << (SignalList() << Insert(12,8)); - QTest::newRow("i(12,5),i(15,3)") - << (SignalList() << Insert(12,5) << Insert(15,3)) - << (SignalList() << Insert(12,8)); - - // Remove - QTest::newRow("r(3,9)") - << (SignalList() << Remove(3,9)) - << (SignalList() << Remove(3,9)); - QTest::newRow("r(3,4),r(3,2)") - << (SignalList() << Remove(3,4) << Remove(3,2)) - << (SignalList() << Remove(3,6)); - QTest::newRow("r(4,3),r(14,5)") - << (SignalList() << Remove(4,3) << Remove(14,5)) - << (SignalList() << Remove(4,3) << Remove(14,5)); - QTest::newRow("r(14,5),r(4,3)") - << (SignalList() << Remove(14,5) << Remove(4,3)) - << (SignalList() << Remove(4,3) << Remove(11,5)); - QTest::newRow("r(4,3),r(2,9)") - << (SignalList() << Remove(4,3) << Remove(2,9)) - << (SignalList() << Remove(2,12)); - - // Move - QTest::newRow("m(8-10,2)") - << (SignalList() << Move(8,10,2,0)) - << (SignalList() << Remove(8,2,0,0) << Insert(10,2,0,0)); - - QTest::newRow("m(23-12,6),m(13-15,5)") - << (SignalList() << Move(23,12,6,0) << Move(13,15,5,1)) - << (SignalList() << Remove(23,6,0,0) << Insert(12,1,0,0) << Insert(15,5,0,1)); - QTest::newRow("m(23-12,6),m(13-15,2)") - << (SignalList() << Move(23,12,6,0) << Move(13,20,2,1)) - << (SignalList() << Remove(23,6,0,0) << Insert(12,1,0,0) << Insert(13,3,0,3) << Insert(20,2,0,1)); - QTest::newRow("m(23-12,6),m(13-2,2)") - << (SignalList() << Move(23,12,6,0) << Move(13,2,2,1)) - << (SignalList() << Remove(23,6,0,0) << Insert(2,2,0,1) << Insert(14,1,0,0) << Insert(15,3,0,3)); - QTest::newRow("m(23-12,6),m(12-6,5)") - << (SignalList() << Move(23,12,6,0) << Move(12,6,5,1)) - << (SignalList() << Remove(23,6,0,0) << Insert(6,5,0,0) << Insert(17,1,0,5)); - QTest::newRow("m(23-12,6),m(10-5,4)") - << (SignalList() << Move(23,12,6,0) << Move(10,5,4,1)) - << (SignalList() << Remove(10,2,1,0) << Remove(21,6,0,0) << Insert(5,2,1,0) << Insert(7,2,0,0) << Insert(14,4,0,2)); - QTest::newRow("m(23-12,6),m(16-5,4)") - << (SignalList() << Move(23,12,6,0) << Move(16,5,4,1)) - << (SignalList() << Remove(12,2,1,2) << Remove(21,6,0,0) << Insert(5,2,0,4) << Insert(7,2,1,2) << Insert(16,4,0,0)); - QTest::newRow("m(23-12,6),m(13-5,4)") - << (SignalList() << Move(23,12,6,0) << Move(13,5,4,1)) - << (SignalList() << Remove(23,6,0,0) << Insert(5,4,0,1) << Insert(16,1,0,0) << Insert(17,1,0,5)); - QTest::newRow("m(23-12,6),m(14-5,4)") - << (SignalList() << Move(23,12,6,0) << Move(14,5,4,1)) - << (SignalList() << Remove(23,6,0,0) << Insert(5,4,0,2) << Insert(16,2,0,0)); - QTest::newRow("m(23-12,6),m(12-5,4)") - << (SignalList() << Move(23,12,6,0) << Move(12,5,4,1)) - << (SignalList() << Remove(23,6,0,0) << Insert(5,4,0,0) << Insert(16,2,0,4)); - QTest::newRow("m(23-12,6),m(11-5,8)") - << (SignalList() << Move(23,12,6,0) << Move(11,5,8,1)) - << (SignalList() << Remove(11,1,1,0) << Remove(11,1,1,7) << Remove(21,6,0,0) << Insert(5,1,1,0) << Insert(6,6,0,0) << Insert(12,1,1,7)); - QTest::newRow("m(23-12,6),m(8-5,4)") - << (SignalList() << Move(23,12,6,0) << Move(8,5,4,1)) - << (SignalList() << Remove(8,4,1,0) << Remove(19,6,0,0) << Insert(5,4,1,0) << Insert(12,6,0,0)); - QTest::newRow("m(23-12,6),m(2-5,4)") - << (SignalList() << Move(23,12,6,0) << Move(2,5,4,1)) - << (SignalList() << Remove(2,4,1,0) << Remove(19,6,0,0) << Insert(5,4,1,0) << Insert(12,6,0,0)); - QTest::newRow("m(23-12,6),m(18-5,4)") - << (SignalList() << Move(23,12,6,0) << Move(18,5,4,1)) - << (SignalList() << Remove(12,4,1,0) << Remove(19,6,0,0) << Insert(5,4,1,0) << Insert(16,6,0,0)); - QTest::newRow("m(23-12,6),m(20-5,4)") - << (SignalList() << Move(23,12,6,0) << Move(20,5,4,1)) - << (SignalList() << Remove(14,4,1,0) << Remove(19,6,0,0) << Insert(5,4,1,0) << Insert(16,6,0,0)); - - QTest::newRow("m(23-12,6),m(5-13,11)") - << (SignalList() << Move(23,12,6,0) << Move(5,13,11,1)) - << (SignalList() << Remove(5,7,1,0) << Remove(16,6,0,0) << Insert(5,2,0,4) << Insert(13,7,1,0) << Insert(20,4,0,0)); - - QTest::newRow("m(23-12,6),m(12-23,6)") - << (SignalList() << Move(23,12,6,0) << Move(12,23,6,1)) - << (SignalList() << Remove(23,6,0,0) << Insert(23,6,0,0)); // ### These cancel out. - QTest::newRow("m(23-12,6),m(10-23,4)") - << (SignalList() << Move(23,12,6,0) << Move(10,23,4,1)) - << (SignalList() << Remove(10,2,1,0) << Remove(21,6,0,0) << Insert(10,4,0,2) << Insert(23,2,1,0) << Insert(25,2,0,0)); - QTest::newRow("m(23-12,6),m(16-23.4)") - << (SignalList() << Move(23,12,6,0) << Move(16,23,4,1)) - << (SignalList() << Remove(12,2,1,2) << Remove(21,6,0,0) << Insert(12,4,0,0) << Insert(23,2,0,4) << Insert(25,2,1,2)); - QTest::newRow("m(23-12,6),m(13-23,4)") - << (SignalList() << Move(23,12,6,0) << Move(13,23,4,1)) - << (SignalList() << Remove(23,6,0,0) << Insert(12,1,0,0) << Insert(13,1,0,5) << Insert(23,4,0,1)); - QTest::newRow("m(23-12,6),m(14-23,)") - << (SignalList() << Move(23,12,6,0) << Move(14,23,4,1)) - << (SignalList() << Remove(23,6,0,0) << Insert(12,2,0,0) << Insert(23,4,0,2)); - QTest::newRow("m(23-12,6),m(12-23,4)") - << (SignalList() << Move(23,12,6,0) << Move(12,23,4,1)) - << (SignalList() << Remove(23,6,0,0) << Insert(12,2,0,4) << Insert(23,4,0,0)); - QTest::newRow("m(23-12,6),m(11-23,8)") - << (SignalList() << Move(23,12,6,0) << Move(11,23,8,1)) - << (SignalList() << Remove(11,1,1,0) << Remove(11,1,1,7) << Remove(21,6,0,0) << Insert(23,1,1,0) << Insert(24,6,0,0) << Insert(30,1,1,7)); - QTest::newRow("m(23-12,6),m(8-23,4)") - << (SignalList() << Move(23,12,6,0) << Move(8,23,4,1)) - << (SignalList() << Remove(8,4,1,0) << Remove(19,6,0,0) << Insert(8,6,0,0) << Insert(23,4,1,0)); - QTest::newRow("m(23-12,6),m(2-23,4)") - << (SignalList() << Move(23,12,6,0) << Move(2,23,4,1)) - << (SignalList() << Remove(2,4,1,0) << Remove(19,6,0,0) << Insert(8,6,0,0) << Insert(23,4,1,0)); - QTest::newRow("m(23-12,6),m(18-23,4)") - << (SignalList() << Move(23,12,6,0) << Move(18,23,4,1)) - << (SignalList() << Remove(12,4,1,0) << Remove(19,6,0,0) << Insert(12,6,0,0) << Insert(23,4,1,0)); - QTest::newRow("m(23-12,6),m(20-23,4)") - << (SignalList() << Move(23,12,6,0) << Move(20,23,4,1)) - << (SignalList() << Remove(14,4,1,0) << Remove(19,6,0,0) << Insert(12,6,0,0) << Insert(23,4,1,0)); - - QTest::newRow("m(23-12,6),m(11-23,10)") - << (SignalList() << Move(23,12,6,0) << Move(11,23,10,1)) - << (SignalList() << Remove(11,1,1,0) << Remove(11,3,1,7) << Remove(19,6,0,0) << Insert(23,1,1,0) << Insert(24,6,0,0) << Insert(30,3,1,7)); - - QTest::newRow("m(3-9,12),m(13-5,12)") - << (SignalList() << Move(3,9,12,0) << Move(13,15,5,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,4,0,0) << Insert(13,2,0,9) << Insert(15,5,0,4) << Insert(20,1,0,11)); - QTest::newRow("m(3-9,12),m(13-15,20)") - << (SignalList() << Move(3,9,12,0) << Move(13,15,20,1)) - << (SignalList() << Remove(3,12,0,0) << Remove(9,12,1,8) << Insert(9,4,0,0) << Insert(15,8,0,4) << Insert(23,12,1,8)); - QTest::newRow("m(3-9,12),m(13-15,2)") - << (SignalList() << Move(3,9,12,0) << Move(13,15,2,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,4,0,0) << Insert(13,2,0,6) << Insert(15,2,0,4) << Insert(17,4,0,8)); - QTest::newRow("m(3-9,12),m(12-5,6)") - << (SignalList() << Move(3,9,12,0) << Move(12,5,6,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(5,6,0,3) << Insert(15,3,0,0) << Insert(18,3,0,9)); - QTest::newRow("m(3-9,12),m(10-14,5)") - << (SignalList() << Move(3,9,12,0) << Move(10,14,5,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,1,0,0) << Insert(10,4,0,6) << Insert(14,5,0,1) << Insert(19,2,0,10)); - QTest::newRow("m(3-9,12),m(16-20,5)") - << (SignalList() << Move(3,9,12,0) << Move(16,20,5,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,7,0,0) << Insert(20,5,0,7)); - QTest::newRow("m(3-9,12),m(13-17,5)") - << (SignalList() << Move(3,9,12,0) << Move(13,17,5,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,4,0,0) << Insert(13,3,0,9) << Insert(17,5,0,4)); - QTest::newRow("m(3-9,12),m(14-18,5)") - << (SignalList() << Move(3,9,12,0) << Move(14,18,5,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,5,0,0) << Insert(14,2,0,10) << Insert(18,5,0,5)); - QTest::newRow("m(3-9,12),m(12-16,5)") - << (SignalList() << Move(3,9,12,0) << Move(12,16,5,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,3,0,0) << Insert(12,4,0,8) << Insert(16,5,0,3)); - QTest::newRow("m(3-9,12),m(11-19,5)") - << (SignalList() << Move(3,9,12,0) << Move(11,19,5,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,2,0,0) << Insert(11,5,0,7) << Insert(19,5,0,2)); - QTest::newRow("m(3-9,12),m(8-12,5)") - << (SignalList() << Move(3,9,12,0) << Move(8,12,5,1)) - << (SignalList() << Remove(3,12,0,0) << Remove(8,1,1,0) << Insert(8,4,0,4) << Insert(12,1,1,0) << Insert(13,4,0,0) << Insert(17,4,0,8)); - QTest::newRow("m(3-9,12),m(2-6,5)") - << (SignalList() << Move(3,9,12,0) << Move(2,6,5,1)) - << (SignalList() << Remove(2,1,1,0) << Remove(2,12,0,0) << Remove(2,4,1,1) << Insert(4,2,0,0) << Insert(6,5,1,0) << Insert(11,10,0,2)); - QTest::newRow("m(3-9,12),m(18-22,5)") - << (SignalList() << Move(3,9,12,0) << Move(18,22,5,1)) - << (SignalList() << Remove(3,12,0,0) << Remove(9,2,1,3) << Insert(9,9,0,0) << Insert(22,3,0,9) << Insert(25,2,1,3)); - QTest::newRow("m(3-9,12),m(20-24,5)") - << (SignalList() << Move(3,9,12,0) << Move(20,24,5,1)) - << (SignalList() << Remove(3,12,0,0) << Remove(9,4,1,1) << Insert(9,11,0,0) << Insert(24,1,0,11) << Insert(25,4,1,1)); - - QTest::newRow("m(3-9,12),m(5-11,8)") - << (SignalList() << Move(3,9,12,0) << Move(5,11,8,1)) - << (SignalList() << Remove(3,12,0,0) << Remove(5,4,1,0) << Insert(5,6,0,4) << Insert(11,4,1,0) << Insert(15,4,0,0) << Insert(19,2,0,10)); - - QTest::newRow("m(3-9,12),m(12-23,6)") - << (SignalList() << Move(3,9,12,0) << Move(12,23,6,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,3,0,0) << Insert(12,3,0,9) << Insert(23,6,0,3)); - QTest::newRow("m(3-9,12),m(10-23,4)") - << (SignalList() << Move(3,9,12,0) << Move(10,23,4,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,1,0,0) << Insert(10,7,0,5) << Insert(23,4,0,1)); - QTest::newRow("m(3-9,12),m(16-23,4)") - << (SignalList() << Move(3,9,12,0) << Move(16,23,4,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,7,0,0) << Insert(16,1,0,11) << Insert(23,4,0,7)); - QTest::newRow("m(3-9,12),m(13-23,4)") - << (SignalList() << Move(3,9,12,0) << Move(13,23,4,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,4,0,0) << Insert(13,4,0,8) << Insert(23,4,0,4)); - QTest::newRow("m(3-9,12),m(14-23,4)") - << (SignalList() << Move(3,9,12,0) << Move(14,23,4,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,5,0,0) << Insert(14,3,0,9) << Insert(23,4,0,5)); - QTest::newRow("m(3-9,12),m(12-23,4)") - << (SignalList() << Move(3,9,12,0) << Move(12,23,4,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,3,0,0) << Insert(12,5,0,7) << Insert(23,4,0,3)); - QTest::newRow("m(3-9,12),m(11-23,8)") - << (SignalList() << Move(3,9,12,0) << Move(11,23,8,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,2,0,0) << Insert(11,2,0,10) << Insert(23,8,0,2)); - QTest::newRow("m(3-9,12),m(8-23,4)") - << (SignalList() << Move(3,9,12,0) << Move(8,23,4,1)) - << (SignalList() << Remove(3,12,0,0) << Remove(8,1,1,0) << Insert(8,9,0,3) << Insert(23,1,1,0) << Insert(24,3,0,0)); - QTest::newRow("m(3-9,12),m(2-23,4)") - << (SignalList() << Move(3,9,12,0) << Move(2,23,4,1)) - << (SignalList() << Remove(2,1,1,0) << Remove(2,12,0,0) << Remove(2,3,1,1) << Insert(5,12,0,0) << Insert(23,4,1,0)); - QTest::newRow("m(3-9,12),m(18-23,4)") - << (SignalList() << Move(3,9,12,0) << Move(18,23,4,1)) - << (SignalList() << Remove(3,12,0,0) << Remove(9,1,1,3) << Insert(9,9,0,0) << Insert(23,3,0,9) << Insert(26,1,1,3)); - QTest::newRow("m(3-9,12),m(20-23,4)") - << (SignalList() << Move(3,9,12,0) << Move(20,23,4,1)) - << (SignalList() << Remove(3,12,0,0) << Remove(9,3,1,1) << Insert(9,11,0,0) << Insert(23,1,0,11) << Insert(24,3,1,1)); - - QTest::newRow("m(3-9,12),m(11-23,10)") - << (SignalList() << Move(3,9,12,0) << Move(11,23,10,1)) - << (SignalList() << Remove(3,12,0,0) << Insert(9,2,0,0) << Insert(23,10,0,2)); - - // Change - QTest::newRow("c(4,5)") - << (SignalList() << Change(4,5)) - << (SignalList() << Change(4,5)); - QTest::newRow("c(4,5),c(12,2)") - << (SignalList() << Change(4,5) << Change(12,2)) - << (SignalList() << Change(4,5) << Change(12,2)); - QTest::newRow("c(12,2),c(4,5)") - << (SignalList() << Change(12,2) << Change(4,5)) - << (SignalList() << Change(4,5) << Change(12,2)); - QTest::newRow("c(4,5),c(2,2)") - << (SignalList() << Change(4,5) << Change(2,2)) - << (SignalList() << Change(2,7)); - QTest::newRow("c(4,5),c(9,2)") - << (SignalList() << Change(4,5) << Change(9,2)) - << (SignalList() << Change(4,7)); - QTest::newRow("c(4,5),c(3,2)") - << (SignalList() << Change(4,5) << Change(3,2)) - << (SignalList() << Change(3,6)); - QTest::newRow("c(4,5),c(8,2)") - << (SignalList() << Change(4,5) << Change(8,2)) - << (SignalList() << Change(4,6)); - QTest::newRow("c(4,5),c(3,2)") - << (SignalList() << Change(4,5) << Change(3,2)) - << (SignalList() << Change(3,6)); - QTest::newRow("c(4,5),c(2,9)") - << (SignalList() << Change(4,5) << Change(2,9)) - << (SignalList() << Change(2,9)); - QTest::newRow("c(4,5),c(12,3),c(8,6)") - << (SignalList() << Change(4,5) << Change(12,3) << Change(8,6)) - << (SignalList() << Change(4,11)); - - // Insert,then remove. - QTest::newRow("i(12,6),r(12,6)") - << (SignalList() << Insert(12,6) << Remove(12,6)) - << (SignalList()); - QTest::newRow("i(12,6),r(10,4)") - << (SignalList() << Insert(12,6) << Remove(10,4)) - << (SignalList() << Remove(10,2) << Insert(10,4)); - QTest::newRow("i(12,6),r(16,4)") - << (SignalList() << Insert(12,6) << Remove(16,4)) - << (SignalList() << Remove(12,2) << Insert(12,4)); - QTest::newRow("i(12,6),r(13,4)") - << (SignalList() << Insert(12,6) << Remove(13,4)) - << (SignalList() << Insert(12,2)); - QTest::newRow("i(12,6),r(14,4)") - << (SignalList() << Insert(12,6) << Remove(14,4)) - << (SignalList() << Insert(12,2)); - QTest::newRow("i(12,6),r(12,4)") - << (SignalList() << Insert(12,6) << Remove(12,4)) - << (SignalList() << Insert(12,2)); - QTest::newRow("i(12,6),r(11,8)") - << (SignalList() << Insert(12,6) << Remove(11,8)) - << (SignalList() << Remove(11,2)); - QTest::newRow("i(12,6),r(8,4)") - << (SignalList() << Insert(12,6) << Remove(8,4)) - << (SignalList() << Remove(8,4) << Insert(8,6)); - QTest::newRow("i(12,6),r(2,4)") - << (SignalList() << Insert(12,6) << Remove(2,4)) - << (SignalList() << Remove(2,4) << Insert(8,6)); - QTest::newRow("i(12,6),r(18,4)") - << (SignalList() << Insert(12,6) << Remove(18,4)) - << (SignalList() << Remove(12,4) << Insert(12,6)); - QTest::newRow("i(12,6),r(20,4)") - << (SignalList() << Insert(12,6) << Remove(20,4)) - << (SignalList() << Remove(14,4) << Insert(12,6)); - - // Insert,then change - QTest::newRow("i(12,6),c(12,6)") - << (SignalList() << Insert(12,6) << Change(12,6)) - << (SignalList() << Insert(12,6)); - QTest::newRow("i(12,6),c(10,6)") - << (SignalList() << Insert(12,6) << Change(10,6)) - << (SignalList() << Insert(12,6) << Change(10,2)); - QTest::newRow("i(12,6),c(16,4)") - << (SignalList() << Insert(12,6) << Change(16,4)) - << (SignalList() << Insert(12,6) << Change(18,2)); - QTest::newRow("i(12,6),c(13,4)") - << (SignalList() << Insert(12,6) << Change(13,4)) - << (SignalList() << Insert(12,6)); - QTest::newRow("i(12,6),c(14,4)") - << (SignalList() << Insert(12,6) << Change(14,4)) - << (SignalList() << Insert(12,6)); - QTest::newRow("i(12,6),c(12,4)") - << (SignalList() << Insert(12,6) << Change(12,4)) - << (SignalList() << Insert(12,6)); - QTest::newRow("i(12,6),c(11,8)") - << (SignalList() << Insert(12,6) << Change(11,8)) - << (SignalList() << Insert(12,6) << Change(11,1) << Change(18,1)); - QTest::newRow("i(12,6),c(8,4)") - << (SignalList() << Insert(12,6) << Change(8,4)) - << (SignalList() << Insert(12,6) << Change(8,4)); - QTest::newRow("i(12,6),c(2,4)") - << (SignalList() << Insert(12,6) << Change(2,4)) - << (SignalList() << Insert(12,6) << Change(2,4)); - QTest::newRow("i(12,6),c(18,4)") - << (SignalList() << Insert(12,6) << Change(18,4)) - << (SignalList() << Insert(12,6) << Change(18,4)); - QTest::newRow("i(12,6),c(20,4)") - << (SignalList() << Insert(12,6) << Change(20,4)) - << (SignalList() << Insert(12,6) << Change(20,4)); - - // Insert,then move - QTest::newRow("i(12,6),m(12-5,6)") - << (SignalList() << Insert(12,6) << Move(12,5,6,0)) - << (SignalList() << Insert(5,6)); - QTest::newRow("i(12,6),m(10-5,4)") - << (SignalList() << Insert(12,6) << Move(10,5,4,0)) - << (SignalList() << Remove(10,2,0,0) << Insert(5,2,0,0) << Insert(7,2) << Insert(14,4)); - QTest::newRow("i(12,6),m(16-5,4)") - << (SignalList() << Insert(12,6) << Move(16,5,4,0)) - << (SignalList() << Remove(12,2,0,2) << Insert(5,2) << Insert(7,2,0,2) << Insert(16,4)); - QTest::newRow("i(12,6),m(13-5,4)") - << (SignalList() << Insert(12,6) << Move(13,5,4,0)) - << (SignalList() << Insert(5,4) << Insert(16,2)); - QTest::newRow("i(12,6),m(14-5,4)") - << (SignalList() << Insert(12,6) << Move(14,5,4,0)) - << (SignalList() << Insert(5,4) << Insert(16,2)); - QTest::newRow("i(12,6),m(12-5,4)") - << (SignalList() << Insert(12,6) << Move(12,5,4,0)) - << (SignalList() << Insert(5,4) << Insert(16,2)); - QTest::newRow("i(12,6),m(11-5,8)") - << (SignalList() << Insert(12,6) << Move(11,5,8,0)) - << (SignalList() << Remove(11,1,0,0) << Remove(11,1,0,7) << Insert(5,1,0,0) << Insert(6,6) << Insert(12,1,0,7)); - QTest::newRow("i(12,6),m(8-5,4)") - << (SignalList() << Insert(12,6) << Move(8,5,4,0)) - << (SignalList() << Remove(8,4,0,0) << Insert(5,4,0,0) << Insert(12,6)); - QTest::newRow("i(12,6),m(2-5,4)") - << (SignalList() << Insert(12,6) << Move(2,5,4,0)) - << (SignalList() << Remove(2,4,0,0) << Insert(5,4,0,0) << Insert(12,6)); - QTest::newRow("i(12,6),m(18-5,4)") - << (SignalList() << Insert(12,6) << Move(18,5,4,0)) - << (SignalList() << Remove(12,4,0,0) << Insert(5,4,0,0) << Insert(16,6)); - QTest::newRow("i(12,6),m(20-5,4)") - << (SignalList() << Insert(12,6) << Move(20,5,4,0)) - << (SignalList() << Remove(14,4,0,0) << Insert(5,4,0,0) << Insert(16,6)); - - QTest::newRow("i(12,6),m(5-13,11)") - << (SignalList() << Insert(12,6) << Move(5,11,8,0)) - << (SignalList() << Remove(5,7,0,0) << Insert(5,5) << Insert(11,7,0,0) << Insert(18,1)); - - QTest::newRow("i(12,6),m(12-23,6)") - << (SignalList() << Insert(12,6) << Move(12,23,6,0)) - << (SignalList() << Insert(23,6)); - QTest::newRow("i(12,6),m(10-23,4)") - << (SignalList() << Insert(12,6) << Move(10,23,4,0)) - << (SignalList() << Remove(10,2,0,0) << Insert(10,4) << Insert(23,2,0,0) << Insert(25,2)); - QTest::newRow("i(12,6),m(16-23,4)") - << (SignalList() << Insert(12,6) << Move(16,23,4,0)) - << (SignalList() << Remove(12,2,0,2) << Insert(12,4) << Insert(23,2) << Insert(25,2,0,2)); - QTest::newRow("i(12,6),m(13-23,4)") - << (SignalList() << Insert(12,6) << Move(13,23,4,0)) - << (SignalList() << Insert(12,2) << Insert(23,4)); - QTest::newRow("i(12,6),m(14-23,4)") - << (SignalList() << Insert(12,6) << Move(14,23,4,0)) - << (SignalList() << Insert(12,2) << Insert(23,4)); - QTest::newRow("i(12,6),m(12-23,4)") - << (SignalList() << Insert(12,6) << Move(12,23,4,0)) - << (SignalList() << Insert(12,2) << Insert(23,4)); - QTest::newRow("i(12,6),m(11-23,8)") - << (SignalList() << Insert(12,6) << Move(11,23,8,0)) - << (SignalList() << Remove(11,1,0,0) << Remove(11,1,0,7) << Insert(23,1,0,0)<< Insert(24,6) << Insert(30,1,0,7)); - QTest::newRow("i(12,6),m(8-23,4)") - << (SignalList() << Insert(12,6) << Move(8,23,4,0)) - << (SignalList() << Remove(8,4,0,0) << Insert(8,6) << Insert(23,4,0,0)); - QTest::newRow("i(12,6),m(2-23,4)") - << (SignalList() << Insert(12,6) << Move(2,23,4,0)) - << (SignalList() << Remove(2,4,0,0) << Insert(8,6) << Insert(23,4,0,0)); - QTest::newRow("i(12,6),m(18-23,4)") - << (SignalList() << Insert(12,6) << Move(18,23,4,0)) - << (SignalList() << Remove(12,4,0,0) << Insert(12,6) << Insert(23,4,0,0)); - QTest::newRow("i(12,6),m(20-23,4)") - << (SignalList() << Insert(12,6) << Move(20,23,4,0)) - << (SignalList() << Remove(14,4,0,0) << Insert(12,6) << Insert(23,4,0,0)); - - QTest::newRow("i(12,6),m(11-23,10)") - << (SignalList() << Insert(12,6) << Move(11,23,10,0)) - << (SignalList() << Remove(11,1,0,0) << Remove(11,3,0,7) << Insert(23,1,0,0) << Insert(24,6) << Insert(30,3,0,7)); - - // Remove,then insert - QTest::newRow("r(12,6),i(12,6)") - << (SignalList() << Remove(12,6) << Insert(12,6)) - << (SignalList() << Remove(12,6) << Insert(12,6)); - QTest::newRow("r(12,6),i(10,4)") - << (SignalList() << Remove(12,6) << Insert(10,14)) - << (SignalList() << Remove(12,6) << Insert(10,14)); - QTest::newRow("r(12,6),i(16,4)") - << (SignalList() << Remove(12,6) << Insert(16,4)) - << (SignalList() << Remove(12,6) << Insert(16,4)); - QTest::newRow("r(12,6),i(13,4)") - << (SignalList() << Remove(12,6) << Insert(13,4)) - << (SignalList() << Remove(12,6) << Insert(13,4)); - QTest::newRow("r(12,6),i(14,4)") - << (SignalList() << Remove(12,6) << Insert(14,4)) - << (SignalList() << Remove(12,6) << Insert(14,4)); - QTest::newRow("r(12,6),i(12,4)") - << (SignalList() << Remove(12,6) << Insert(12,4)) - << (SignalList() << Remove(12,6) << Insert(12,4)); - QTest::newRow("r(12,6),i(11,8)") - << (SignalList() << Remove(12,6) << Insert(11,8)) - << (SignalList() << Remove(12,6) << Insert(11,8)); - QTest::newRow("r(12,6),i(8,4)") - << (SignalList() << Remove(12,6) << Insert(8,4)) - << (SignalList() << Remove(12,6) << Insert(8,4)); - QTest::newRow("r(12,6),i(2,4)") - << (SignalList() << Remove(12,6) << Insert(2,4)) - << (SignalList() << Remove(12,6) << Insert(2,4)); - QTest::newRow("r(12,6),i(18,4)") - << (SignalList() << Remove(12,6) << Insert(18,4)) - << (SignalList() << Remove(12,6) << Insert(18,4)); - QTest::newRow("r(12,6),i(20,4)") - << (SignalList() << Remove(12,6) << Insert(20,4)) - << (SignalList() << Remove(12,6) << Insert(20,4)); - - // Move,then insert - QTest::newRow("m(12-5,6),i(12,6)") - << (SignalList() << Move(12,5,6,0) << Insert(12,6)) - << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(12,6)); - QTest::newRow("m(12-5,6),i(10,4)") - << (SignalList() << Move(12,5,6,0) << Insert(10,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(5,5,0,0) << Insert(10,4) << Insert(14,1,0,5)); - QTest::newRow("m(12-5,6),i(16,4)") - << (SignalList() << Move(12,5,6,0) << Insert(16,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(16,4)); - QTest::newRow("m(12-5,6),i(13,4)") - << (SignalList() << Move(12,5,6,0) << Insert(13,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(13,4)); - QTest::newRow("m(12-5,6),i(14,4)") - << (SignalList() << Move(12,5,6,0) << Insert(14,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(14,4)); - QTest::newRow("m(12-5,6),i(12,4)") - << (SignalList() << Move(12,5,6,0) << Insert(12,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(12,4)); - QTest::newRow("m(12-5,6),i(11,8)") - << (SignalList() << Move(12,5,6,0) << Insert(11,8)) - << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(11,8)); - QTest::newRow("m(12-5,6),i(8,4)") - << (SignalList() << Move(12,5,6,0) << Insert(8,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(5,3,0,0) << Insert(8,4) << Insert(12,3,0,3)); - QTest::newRow("m(12-5,6),i(2,4)") - << (SignalList() << Move(12,5,6,0) << Insert(2,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(2,4) << Insert(9,6,0,0)); - QTest::newRow("m(12-5,6),i(18,4)") - << (SignalList() << Move(12,5,6,0) << Insert(18,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(18,4)); - QTest::newRow("m(12-5,6),i(20,4)") - << (SignalList() << Move(12,5,6,0) << Insert(20,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(5,6,0,0) << Insert(20,4)); - - QTest::newRow("m(12-23,6),i(12,6)") - << (SignalList() << Move(12,23,6,0) << Insert(12,6)) - << (SignalList() << Remove(12,6,0,0) << Insert(12,6) << Insert(29,6,0,0)); - QTest::newRow("m(12-23,6),i(10,4)") - << (SignalList() << Move(12,23,6,0) << Insert(10,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(10,4) << Insert(27,6,0,0)); - QTest::newRow("m(12-23,6),i(16,4)") - << (SignalList() << Move(12,23,6,0) << Insert(16,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(16,4) << Insert(27,6,0,0)); - QTest::newRow("m(12-23,6),i(13,4)") - << (SignalList() << Move(12,23,6,0) << Insert(13,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(13,4) << Insert(27,6,0,0)); - QTest::newRow("m(12-23,6),i(14,4)") - << (SignalList() << Move(12,23,6,0) << Insert(14,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(14,4) << Insert(27,6,0,0)); - QTest::newRow("m(12-23,6),i(12,4)") - << (SignalList() << Move(12,23,6,0) << Insert(12,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(12,4) << Insert(27,6,0,0)); - QTest::newRow("m(12-23,6),i(11,8)") - << (SignalList() << Move(12,23,6,0) << Insert(11,8)) - << (SignalList() << Remove(12,6,0,0) << Insert(11,8) << Insert(31,6,0,0)); - QTest::newRow("m(12-23,6),i(8,4)") - << (SignalList() << Move(12,23,6,0) << Insert(8,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(8,4) << Insert(27,6,0,0)); - QTest::newRow("m(12-23,6),i(2,4)") - << (SignalList() << Move(12,23,6,0) << Insert(2,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(2,4) << Insert(27,6,0,0)); - QTest::newRow("m(12-23,6),i(18,4)") - << (SignalList() << Move(12,23,6,0) << Insert(18,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(18,4) << Insert(27,6,0,0)); - QTest::newRow("m(12-23,6),i(20,4)") - << (SignalList() << Move(12,23,6,0) << Insert(20,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(20,4) << Insert(27,6,0,0)); - - // Move,then remove - QTest::newRow("m(12-5,6),r(12,6)") - << (SignalList() << Move(12,5,6,0) << Remove(12,6)) - << (SignalList() << Remove(6,6) << Remove(6,6,0,0) << Insert(5,6,0,0)); - QTest::newRow("m(12-5,6),r(10,4)") - << (SignalList() << Move(12,5,6,0) << Remove(10,4)) // ### - << (SignalList() << Remove(5,3) << Remove(9,6,0,0) << Insert(5,5,0,0)); - QTest::newRow("m(12-5,6),r(16,4)") - << (SignalList() << Move(12,5,6,0) << Remove(16,4)) - << (SignalList() << Remove(10,2) << Remove(10,6,0,0) << Remove(10,2) << Insert(5,6,0,0)); - QTest::newRow("m(12-5,6),r(13,4)") - << (SignalList() << Move(12,5,6,0) << Remove(13,4)) - << (SignalList() << Remove(7,4) << Remove(8,6,0,0) << Insert(5,6,0,0)); - QTest::newRow("m(12-5,6),r(14,4)") - << (SignalList() << Move(12,5,6,0) << Remove(14,4)) - << (SignalList() << Remove(8,4) << Remove(8,6,0,0) << Insert(5,6,0,0)); - QTest::newRow("m(12-5,6),r(12,4)") - << (SignalList() << Move(12,5,6,0) << Remove(12,4)) - << (SignalList() << Remove(6,4) << Remove(8,6,0,0) << Insert(5,6,0,0)); - QTest::newRow("m(12-5,6),r(11,8)") - << (SignalList() << Move(12,5,6,0) << Remove(11,8)) - << (SignalList() << Remove(5,7) << Remove(5,6,0,0) << Remove(5,1) << Insert(5,6,0,0)); - QTest::newRow("m(12-5,6),r(8,4)") - << (SignalList() << Move(12,5,6,0) << Remove(8,4)) // ### - << (SignalList() << Remove(5,1) << Remove(11,6,0,0) << Insert(5,3,0,0)); - QTest::newRow("m(12-5,6),r(2,4)") - << (SignalList() << Move(12,5,6,0) << Remove(2,4)) - << (SignalList() << Remove(2,3) << Remove(9,6,0,0) << Insert(2,5,0,1)); - QTest::newRow("m(12-5,6),r(6,4)") - << (SignalList() << Move(12,5,6,0) << Remove(6,4)) - << (SignalList() << Remove(12,6,0,0) << Insert(5,1,0,0) << Insert(6,1,0,5)); - QTest::newRow("m(12-5,6),r(18,4)") - << (SignalList() << Move(12,5,6,0) << Remove(18,4)) - << (SignalList() << Remove(12,6,0,0) << Remove(12,4) << Insert(5,6,0,0)); - QTest::newRow("m(12-5,6),r(20,4)") - << (SignalList() << Move(12,5,6,0) << Remove(20,4)) - << (SignalList() << Remove(12,6,0,0) << Remove(14,4) << Insert(5,6,0,0)); - - QTest::newRow("m(12-23,6),r(12,6)") - << (SignalList() << Move(12,23,6,0) << Remove(12,6)) - << (SignalList() << Remove(12,6,0,0) << Remove(12,6) << Insert(17,6,0,0)); - QTest::newRow("m(12-23,6),r(10,4)") - << (SignalList() << Move(12,23,6,0) << Remove(10,4)) - << (SignalList() << Remove(10,2) << Remove(10,6,0,0) << Remove(10,2) << Insert(19,6,0,0)); - QTest::newRow("m(12-23,6),r(16,4)") - << (SignalList() << Move(12,23,6,0) << Remove(16,4)) - << (SignalList() << Remove(12,6,0,0) << Remove(16,4) << Insert(19,6,0,0)); - QTest::newRow("m(12-23,6),r(13,4)") - << (SignalList() << Move(12,23,6,0) << Remove(13,4)) - << (SignalList() << Remove(12,6,0,0) << Remove(13,4) << Insert(19,6,0,0)); - QTest::newRow("m(12-23,6),r(14,4)") - << (SignalList() << Move(12,23,6,0) << Remove(14,4)) - << (SignalList() << Remove(12,6,0,0) << Remove(14,4) << Insert(19,6,0,0)); - QTest::newRow("m(12-23,6),r(12,4)") - << (SignalList() << Move(12,23,6,0) << Remove(12,4)) - << (SignalList() << Remove(12,6,0,0) << Remove(12,4) << Insert(19,6,0,0)); - QTest::newRow("m(12-23,6),r(11,8)") - << (SignalList() << Move(12,23,6,0) << Remove(11,8)) - << (SignalList() << Remove(11,1) << Remove(11,6,0,0) << Remove(11,7) << Insert(15,6,0,0)); - QTest::newRow("m(12-23,6),r(8,4)") - << (SignalList() << Move(12,23,6,0) << Remove(8,4)) - << (SignalList() << Remove(8,4) << Remove(8,6,0,0) << Insert(19,6,0,0)); - QTest::newRow("m(12-23,6),r(2,4)") - << (SignalList() << Move(12,23,6,0) << Remove(2,4)) - << (SignalList() << Remove(2,4) << Remove(8,6,0,0) << Insert(19,6,0,0)); - QTest::newRow("m(12-23,6),r(18,4)") - << (SignalList() << Move(12,23,6,0) << Remove(18,4)) - << (SignalList() << Remove(12,6,0,0) << Remove(18,4) << Insert(19,6,0,0)); - QTest::newRow("m(12-23,6),r(20,4)") - << (SignalList() << Move(12,23,6,0) << Remove(20,4)) - << (SignalList() << Remove(12,6,0,0) << Remove(20,3) << Insert(20,5,0,1)); - - - // Complex - QTest::newRow("r(15,1),r(22,1)") - << (SignalList() << Remove(15,1) << Remove(22,1)) - << (SignalList() << Remove(15,1) << Remove(22,1)); - QTest::newRow("r(15,1),r(22,1),r(25,1)") - << (SignalList() << Remove(15,1) << Remove(22,1) << Remove(25,1)) - << (SignalList() << Remove(15,1) << Remove(22,1) << Remove(25,1)); - QTest::newRow("r(15,1),r(22,1),r(25,1),r(15,1)") - << (SignalList() << Remove(15,1) << Remove(22,1) << Remove(25,1) << Remove(15,1)) - << (SignalList() << Remove(15,2) << Remove(21,1) << Remove(24,1)); - QTest::newRow("r(15,1),r(22,1),r(25,1),r(15,1),r(13,1)") - << (SignalList() << Remove(15,1) << Remove(22,1) << Remove(25,1) << Remove(15,1) << Remove(13,1)) - << (SignalList() << Remove(13,1) << Remove(14,2) << Remove(20,1) << Remove(23,1)); - QTest::newRow("r(15,1),r(22,1),r(25,1),r(15,1),r(13,1),r(13,1)") - << (SignalList() << Remove(15,1) << Remove(22,1) << Remove(25,1) << Remove(15,1) << Remove(13,1) << Remove(13,1)) - << (SignalList() << Remove(13,4) << Remove(19,1) << Remove(22,1)); - QTest::newRow("r(15,1),r(22,1),r(25,1),r(15,1),r(13,1),r(13,1),m(12,13,1)") - << (SignalList() << Remove(15,1) << Remove(22,1) << Remove(25,1) << Remove(15,1) << Remove(13,1) << Remove(13,1) << Move(12,13,1,0)) - << (SignalList() << Remove(12,1,0,0) << Remove(12,4) << Remove(18,1) << Remove(21,1) << Insert(13,1,0,0)); - - QTest::newRow("r(12,18),r(3,0)") - << (SignalList() << Remove(12,18) << Remove(3,0)) - << (SignalList() << Remove(12,18)); - QTest::newRow("r(12,18),r(3,0),r(1,2)") - << (SignalList() << Remove(12,18) << Remove(3,0) << Remove(1,2)) - << (SignalList() << Remove(1,2) << Remove(10,18)); - QTest::newRow("r(12,18),r(3,0),r(1,2),m(4,0,11)") - << (SignalList() << Remove(12,18) << Remove(3,0) << Remove(1,2) << Move(4,0,11,0)) - << (SignalList() << Remove(1,2) << Remove(4,6,0,0) << Remove(4,18) << Remove(4,5,0,6) << Insert(0,11,0,0)); - QTest::newRow("r(12,18),r(3,0),r(1,2),m(4,0,11),r(14,3)") - << (SignalList() << Remove(12,18) << Remove(3,0) << Remove(1,2) << Move(4,0,11,0) << Remove(14,3)) - << (SignalList() << Remove(1,2) << Remove(3,1) << Remove(3,6,0,0) << Remove(3,18) << Remove(3,5,0,6) << Remove(3,2) << Insert(0,11,0,0)); - - QTest::newRow("m(9,11,14),i(16,1)") - << (SignalList() << Move(9,11,14,0) << Insert(16,1)) - << (SignalList() << Remove(9,14,0,0) << Insert(11,5,0,0) << Insert(16,1) << Insert(17,9,0,5)); - QTest::newRow("m(9,11,14),i(16,1),m(22,38,3)") - << (SignalList() << Move(9,11,14,0) << Insert(16,1) << Move(22,38,3,1)) - << (SignalList() << Remove(9,14,0,0) << Insert(11,5,0,0) << Insert(16,1) << Insert(17,5,0,5) << Insert(22,1,0,13) << Insert(38,3,0,10)); - - QTest::newRow("i(28,2),m(7,5,22)") - << (SignalList() << Insert(28,2) << Move(7,5,22,0)) - << (SignalList() << Remove(7,21,0,0) << Insert(5,21,0,0) << Insert(26,1) << Insert(29,1)); - - QTest::newRow("i(16,3),m(18,28,15)") - << (SignalList() << Insert(16,3) << Move(18,28,15,0)) - << (SignalList() << Remove(16,14,0,1) << Insert(16,2) << Insert(28,1) << Insert(29,14,0,1)); - - QTest::newRow("m(33,12,6),m(18,20,20)") - << (SignalList() << Move(22,12,6,0) << Move(18,20,20,1)) - << (SignalList() << Remove(12,10,1,0) << Remove(12,6,0,0) << Remove(12,10,1,10) - << Insert(12,6,0,0) << Insert(20,20,1,0)); - QTest::newRow("m(33,12,6),m(18,20,20),m(38,19,1)") - << (SignalList() << Move(22,12,6,0) << Move(18,20,20,1) << Move(28,19,1,2)) - << (SignalList() << Remove(12,10,1,0) << Remove(12,6,0,0) << Remove(12,10,1,10) - << Insert(12,6,0,0) << Insert(19,1,1,8) << Insert(21,8,1,0) << Insert(29,11,1,9)); - QTest::newRow("m(33,12,6),m(18,20,20),m(38,19,1),r(34,4)") - << (SignalList() << Move(22,12,6,0) << Move(18,20,20,1) << Move(28,19,1,2) << Remove(34,4)) - << (SignalList() << Remove(12,10,1,0) << Remove(12,6,0,0) << Remove(12,10,1,10) - << Insert(12,6,0,0) << Insert(19,1,1,8) << Insert(21,8,1,0) << Insert(29,5,1,9) << Insert(34,2,1,18)); - QTest::newRow("m(33,12,6),m(18,20,20),m(38,19,1),r(34,4),m(13,9,15)") - << (SignalList() << Move(22,12,6,0) << Move(18,20,20,1) << Move(28,19,1,2) << Remove(34,4) << Move(13,9,15,3)) - << (SignalList() << Remove(12,10,1,0) << Remove(12,6,0,0) << Remove(12,10,1,10) << Remove(12,1,3,5) << Remove(12,1,3,7) - << Insert(9,5,0,1) << Insert(14,1,3,5) << Insert(15,1,1,8) << Insert(16,1,3,7) << Insert(17,7,1,0) << Insert(27,1,0,0) << Insert(28,1,1,7) << Insert(29,5,1,9) << Insert(34,2,1,18)); - - QTest::newRow("i(8,5),m(14,26,14)") - << (SignalList() << Insert(8,5) << Move(14,26,14,0)) - << (SignalList() << Remove(9,14,0,0) << Insert(8,5) << Insert(26,14,0,0)); - QTest::newRow("i(8,5),m(14,26,14),r(45,0)") - << (SignalList() << Insert(8,5) << Move(14,26,14,0) << Remove(45,0)) - << (SignalList() << Remove(9,14,0,0) << Insert(8,5) << Insert(26,14,0,0)); - QTest::newRow("i(8,5),m(14,26,14),r(45,0),m(5,8,21)") - << (SignalList() << Insert(8,5) << Move(14,26,14,0) << Remove(45,0) << Move(5,8,21,1)) - << (SignalList() << Remove(5,3,1,0) << Remove(5,1,1,8) << Remove(5,14,0,0) << Remove(5,12,1,9) - << Insert(5,3,0,0) << Insert(8,3,1,0) << Insert(11,5) << Insert(16,13,1,8) << Insert(29,11,0,3)); - - QTest::newRow("i(35,1),r(5,31)") - << (SignalList() << Insert(35,1) << Remove(5,31)) - << (SignalList() << Remove(5,30)); - QTest::newRow("i(35,1),r(5,31),m(9,8,1)") - << (SignalList() << Insert(35,1) << Remove(5,31) << Move(9,8,1,0)) - << (SignalList() << Remove(5,30) << Remove(9,1,0,0) << Insert(8,1,0,0)); - QTest::newRow("i(35,1),r(5,31),m(9,8,1),i(7,2)") - << (SignalList() << Insert(35,1) << Remove(5,31) << Move(9,8,1,0) << Insert(7,2)) - << (SignalList() << Remove(5,30) << Remove(9,1,0,0) << Insert(7,2) << Insert(10,1,0,0)); - QTest::newRow("i(35,1),r(5,31),m(9,8,1),i(7,2),r(4,3)") - << (SignalList() << Insert(35,1) << Remove(5,31) << Move(9,8,1,0) << Insert(7,2) << Remove(4,3)) - << (SignalList() << Remove(4,33) << Remove(6,1,0,0) << Insert(4,2) << Insert(7,1,0,0)); - - QTest::newRow("r(37,0),r(21,1)") - << (SignalList() << Remove(37,0) << Remove(21,1)) - << (SignalList() << Remove(21,1)); - QTest::newRow("r(37,0),r(21,1),m(27,35,2)") - << (SignalList() << Remove(37,0) << Remove(21,1) << Move(27,35,2,0)) - << (SignalList() << Remove(21,1) << Remove(27,2,0,0) << Insert(35,2,0,0)); - QTest::newRow("r(37,0),r(21,1),m(27,35,2),i(31,5)") - << (SignalList() << Remove(37,0) << Remove(21,1) << Move(27,35,2,0) << Insert(31,5)) - << (SignalList() << Remove(21,1) << Remove(27,2,0,0) << Insert(31,5) << Insert(40,2,0,0)); - QTest::newRow("r(37,0),r(21,1),m(27,35,2),i(31,5),r(10,31)") - << (SignalList() << Remove(37,0) << Remove(21,1) << Move(27,35,2,0) << Insert(31,5) << Remove(10,31)) - << (SignalList() << Remove(10, 18) << Remove(10,2,0,0) << Remove(10,8) << Insert(10,1,0,1)); - - QTest::newRow("m(1,1,39),r(26,10)") - << (SignalList() << Move(1,1,39,0) << Remove(26,10)) - << (SignalList() << Remove(1,39,0,0) << Insert(1,25,0,0) << Insert(26,4,0,35)); - QTest::newRow("m(1,1,39),r(26,10),i(10,5)") - << (SignalList() << Move(1,1,39,0) << Remove(26,10) << Insert(10,5)) - << (SignalList() << Remove(1,39,0,0) << Insert(1,9,0,0) << Insert(10,5) << Insert(15,16,0,9) << Insert(31,4,0,35)); - QTest::newRow("m(1,1,39),r(26,10),i(10,5),i(27,3)") - << (SignalList() << Move(1,1,39,0) << Remove(26,10) << Insert(10,5) << Insert(27,3)) - << (SignalList() << Remove(1,39,0,0) - << Insert(1,9,0,0) << Insert(10,5) << Insert(15,12,0,9) << Insert(27,3) << Insert(30,4,0,21) << Insert(34,4,0,35)); - QTest::newRow("m(1,1,39),r(26,10),i(10,5),i(27,3),r(28,5)") - << (SignalList() << Move(1,1,39,0) << Remove(26,10) << Insert(10,5) << Insert(27,3) << Remove(28,5)) - << (SignalList() << Remove(1,39,0,0) - << Insert(1,9,0,0) << Insert(10,5) << Insert(15,12,0,9) << Insert(27,1) << Insert(28,1,0,24) << Insert(29,4,0,35)); - - QTest::newRow("i(36,4)m(25,39,5)") - << (SignalList() << Insert(36,4) << Move(25,39,5,0)) - << (SignalList() << Remove(25,5,0,0) << Insert(31,4) << Insert(39,5,0,0)); - QTest::newRow("i(36,4)m(25,39,5),i(16,5)") - << (SignalList() << Insert(36,4) << Move(25,39,5,0) << Insert(16,5)) - << (SignalList() << Remove(25,5,0,0) << Insert(16,5) << Insert(36,4) << Insert(44,5,0,0)); - QTest::newRow("i(36,4)m(25,39,5),i(16,5),i(37,5)") - << (SignalList() << Insert(36,4) << Move(25,39,5,0) << Insert(16,5) << Insert(37,5)) - << (SignalList() << Remove(25,5,0,0) << Insert(16,5) << Insert(36,9) << Insert(49,5,0,0)); - QTest::newRow("i(36,4)m(25,39,5),i(16,5),i(37,5),m(40,21,11)") - << (SignalList() << Insert(36,4) << Move(25,39,5,0) << Insert(16,5) << Insert(37,5) << Move(40,21,11,1)) - << (SignalList() << Remove(25,5,0,0) << Remove(31,4,1,5) - << Insert(16,10) << Insert(26,4,1,5) << Insert(30,2,0,0) << Insert(47,4) << Insert(51,3,0,2)); - - QTest::newRow("i(24,1),r(33,4)") - << (SignalList() << Insert(24,1) << Remove(33,4)) - << (SignalList() << Remove(32,4) << Insert(24,1)); - QTest::newRow("i(24,1),r(33,4),r(15,15)") - << (SignalList() << Insert(24,1) << Remove(33,4) << Remove(15,15)) - << (SignalList() << Remove(15,14) << Remove(18,4)); - QTest::newRow("i(24,1),r(33,4),r(15,15),m(8,10,2)") - << (SignalList() << Insert(24,1) << Remove(33,4) << Remove(15,15) << Move(8,10,2,0)) - << (SignalList() << Remove(8,2,0,0) << Remove(13,14) << Remove(16,4) << Insert(10,2,0,0)); - QTest::newRow("i(24,1),r(33,4),r(15,15),m(8,10,2),r(2,19)") - << (SignalList() << Insert(24,1) << Remove(33,4) << Remove(15,15) << Move(8,10,2,0) << Remove(2,19)) - << (SignalList() << Remove(2,6) << Remove(2,2,0,0) << Remove(2,29)); - - QTest::newRow("r(1,35),i(3,4),m(4,2,2)") - << (SignalList() << Remove(1,35) << Insert(3,4) << Move(4,2,2,0)) - << (SignalList() << Remove(1,35) <("input"); - - QTest::newRow("(r(1,35),i(3,4)),(m(4,2,2),r(7,1))") - << (SignalListList() - << (SignalList() << Remove(1,35) << Insert(3,4)) - << (SignalList() << Move(4,2,2,0) << Remove(7,1))); - - QTest::newRow("(i(30,4),m(7,28,16))(m(6,7,13),m(41,35,2))") - << (SignalListList() - << (SignalList() << Insert(30,4) << Move(7,28,16,0)) - << (SignalList() << Move(6,7,13,1) << Move(41,35,2,2))); - - QTest::newRow("(i(35,2),r(39,0))(r(25,11),m(24,8,7))") - << (SignalListList() - << (SignalList() << Insert(35,2) << Remove(39,0)) - << (SignalList() << Remove(25,11) << Move(24,8,7,0))); - - QTest::newRow("i(26,1),i(39,1),m(31,34,2),r(15,27)") - << (SignalListList() - << (SignalList() << Insert(26,1) << Insert(39,1)) - << (SignalList() << Move(31,34,2,0) << Remove(15,27))); - - QTest::newRow("i(19,1),(2,3),r(38,4),m(2,20,3)") - << (SignalListList() - << (SignalList() << Insert(19,1) << Insert(2,3)) - << (SignalList() << Remove(38,4) << Move(2,20,3,0))); - - QTest::newRow("i(4,3),i(19,1),i(31,3),m(8,10,29)") - << (SignalListList() - << (SignalList() << Insert(4,3) << Insert(19,1)) - << (SignalList() << Insert(31,3) << Move(8,10,29,0))); - - QTest::newRow("m(18,15,16),i(0,1),i(32,2),i(29,2)") - << (SignalListList() - << (SignalList() << Move(18,15,16,0) << Insert(0,1)) - << (SignalList() << Insert(32,2) << Insert(29,2))); - - QTest::newRow("i(38,5),i(12,5),i(48,3),m(28,6,6)") - << (SignalListList() - << (SignalList() << Insert(38,5) << Insert(12,5)) - << (SignalList() << Insert(48,3) << Move(28,6,6,0))); - - QTest::newRow("r(8,9),m(7,10,18),m(8,10,18),i(17,2)") - << (SignalListList() - << (SignalList() << Remove(8,9) << Move(7,10,18,0)) - << (SignalList() << Move(8,10,18,1) << Insert(17,2))); - - QTest::newRow("r(39,0),m(18,1,21),m(2,6,31),r(9,4)") - << (SignalListList() - << (SignalList() << Remove(39,0) << Move(18,1,21,0)) - << (SignalList() << Move(2,6,31,1) << Remove(9,4))); - - QTest::newRow("3*5 (5)") - << (SignalListList() - << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5))); - QTest::newRow("3*5 (6)") - << (SignalListList() - << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) - << (SignalList() << Insert(1,1))); - QTest::newRow("3*5 (7)") - << (SignalListList() - << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) - << (SignalList() << Insert(1,1) << Move(9,32,3,1))); - QTest::newRow("3*5 (8)") - << (SignalListList() - << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) - << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1))); - QTest::newRow("3*5 (9)") - << (SignalListList() - << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) - << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3))); - QTest::newRow("3*5 (10)") - << (SignalListList() - << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) - << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3) << Move(7,15,23,2))); - QTest::newRow("3*5 (11)") - << (SignalListList() - << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) - << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3) << Move(7,15,23,2)) - << (SignalList() << Move(38,23,1,3))); - QTest::newRow("3*5 (12)") - << (SignalListList() - << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) - << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3) << Move(7,15,23,2)) - << (SignalList() << Move(38,23,1,3) << Move(38,31,0,4))); - QTest::newRow("3*5 (13)") - << (SignalListList() - << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) - << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3) << Move(7,15,23,2)) - << (SignalList() << Move(38,23,1,3) << Move(38,31,0,4) << Remove(26,11))); - QTest::newRow("3*5 (14)") - << (SignalListList() - << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) - << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3) << Move(7,15,23,2)) - << (SignalList() << Move(38,23,1,3) << Move(38,31,0,4) << Remove(26,11) << Move(5,7,18,5))); - QTest::newRow("3*5 (15)") - << (SignalListList() - << (SignalList() << Remove(36,4) << Move(3,2,14,0) << Insert(36,3) << Remove(30,7) << Insert(3,5)) - << (SignalList() << Insert(1,1) << Move(9,32,3,1) << Remove(22,1) << Insert(29,3) << Move(7,15,23,2)) - << (SignalList() << Move(38,23,1,3) << Move(38,31,0,4) << Remove(26,11) << Move(5,7,18,5) << Move(19,0,8,6))); -} - -void tst_qquickchangeset::apply() -{ - QFETCH(SignalListList, input); - - QQuickChangeSet set; - QQuickChangeSet linearSet; - - foreach (const SignalList &list, input) { - QQuickChangeSet intermediateSet; - foreach (const Signal &signal, list) { - if (signal.isRemove()) { - intermediateSet.remove(signal.index, signal.count); - linearSet.remove(signal.index, signal.count); - } else if (signal.isInsert()) { - intermediateSet.insert(signal.index, signal.count); - linearSet.insert(signal.index, signal.count); - } else if (signal.isMove()) { - intermediateSet.move(signal.index, signal.to, signal.count, signal.moveId); - linearSet.move(signal.index, signal.to, signal.count, signal.moveId); - } - } - set.apply(intermediateSet); - } - - SignalList changes; - foreach (const QQuickChangeSet::Remove &remove, set.removes()) - changes << Remove(remove.index, remove.count, remove.moveId, remove.offset); - foreach (const QQuickChangeSet::Insert &insert, set.inserts()) - changes << Insert(insert.index, insert.count, insert.moveId, insert.offset); - - SignalList linearChanges; - foreach (const QQuickChangeSet::Remove &remove, linearSet.removes()) - linearChanges << Remove(remove.index, remove.count, remove.moveId, remove.offset); - foreach (const QQuickChangeSet::Insert &insert, linearSet.inserts()) - linearChanges << Insert(insert.index, insert.count, insert.moveId, insert.offset); - - // The output in the failing tests isn't incorrect, merely sub-optimal. - QEXPECT_FAIL("3*5 (10)", "inserts not joined when dividing space removed", Abort); - QEXPECT_FAIL("3*5 (11)", "inserts not joined when dividing space removed", Abort); - QEXPECT_FAIL("3*5 (12)", "inserts not joined when dividing space removed", Abort); - QEXPECT_FAIL("3*5 (13)", "inserts not joined when dividing space removed", Abort); - QEXPECT_FAIL("3*5 (14)", "inserts not joined when dividing space removed", Abort); - QEXPECT_FAIL("3*5 (15)", "inserts not joined when dividing space removed", Abort); - QCOMPARE(changes, linearChanges); -} - -void tst_qquickchangeset::removeConsecutive_data() -{ - QTest::addColumn("input"); - QTest::addColumn("output"); - - QTest::newRow("at start") - << (SignalList() << Remove(0,2) << Remove(0,1) << Remove(0,5)) - << (SignalList() << Remove(0,8)); - QTest::newRow("offset") - << (SignalList() << Remove(3,2) << Remove(3,1) << Remove(3,5)) - << (SignalList() << Remove(3,8)); - QTest::newRow("with move") - << (SignalList() << Remove(0,2) << Remove(0,1,0,0) << Remove(0,5)) - << (SignalList() << Remove(0,2) << Remove(0,1,0,0) << Remove(0,5)); -} - -void tst_qquickchangeset::removeConsecutive() -{ - QFETCH(SignalList, input); - QFETCH(SignalList, output); - - QVector removes; - foreach (const Signal &signal, input) { - QVERIFY(signal.isRemove()); - removes.append(QQuickChangeSet::Remove(signal.index, signal.count, signal.moveId, signal.offset)); - } - - QQuickChangeSet set; - set.remove(removes); - - SignalList changes; - foreach (const QQuickChangeSet::Remove &remove, set.removes()) - changes << Remove(remove.index, remove.count, remove.moveId, remove.offset); - QVERIFY(set.inserts().isEmpty()); - QVERIFY(set.changes().isEmpty()); - - VERIFY_EXPECTED_OUTPUT - QCOMPARE(changes, output); -} - -void tst_qquickchangeset::insertConsecutive_data() -{ - QTest::addColumn("input"); - QTest::addColumn("output"); - - QTest::newRow("at start") - << (SignalList() << Insert(0,2) << Insert(2,1) << Insert(3,5)) - << (SignalList() << Insert(0,8)); - QTest::newRow("offset") - << (SignalList() << Insert(3,2) << Insert(5,1) << Insert(6,5)) - << (SignalList() << Insert(3,8)); - QTest::newRow("with move") - << (SignalList() << Insert(0,2) << Insert(2,1,0,0) << Insert(3,5)) - << (SignalList() << Insert(0,2) << Insert(2,1,0,0) << Insert(3,5)); -} - -void tst_qquickchangeset::insertConsecutive() -{ - QFETCH(SignalList, input); - QFETCH(SignalList, output); - - QVector inserts; - foreach (const Signal &signal, input) { - QVERIFY(signal.isInsert()); - inserts.append(QQuickChangeSet::Insert(signal.index, signal.count, signal.moveId, signal.offset)); - } - - QQuickChangeSet set; - set.insert(inserts); - - SignalList changes; - foreach (const QQuickChangeSet::Insert &insert, set.inserts()) - changes << Insert(insert.index, insert.count, insert.moveId, insert.offset); - QVERIFY(set.removes().isEmpty()); - QVERIFY(set.changes().isEmpty()); - - VERIFY_EXPECTED_OUTPUT - QCOMPARE(changes, output); -} - -void tst_qquickchangeset::copy() -{ - QQuickChangeSet changeSet; - changeSet.remove(0, 12); - changeSet.remove(5, 4); - changeSet.insert(3, 9); - changeSet.insert(15, 2); - changeSet.change(24, 8); - changeSet.move(3, 5, 9, 0); - - QQuickChangeSet copy(changeSet); - - QQuickChangeSet assign; - assign = changeSet; - - copy.move(4, 2, 5, 1); - assign.move(4, 2, 5, 1); - changeSet.move(4, 2, 5, 1); - - QCOMPARE(copy.removes(), changeSet.removes()); - QCOMPARE(copy.inserts(), changeSet.inserts()); - QCOMPARE(copy.changes(), changeSet.changes()); - QCOMPARE(copy.difference(), changeSet.difference()); - - QCOMPARE(assign.removes(), changeSet.removes()); - QCOMPARE(assign.inserts(), changeSet.inserts()); - QCOMPARE(assign.changes(), changeSet.changes()); - QCOMPARE(assign.difference(), changeSet.difference()); -} - -void tst_qquickchangeset::debug() -{ - QQuickChangeSet changeSet; - changeSet.remove(0, 12); - changeSet.remove(5, 4); - changeSet.insert(3, 9); - changeSet.insert(15, 2); - changeSet.change(24, 8); - - QTest::ignoreMessage(QtDebugMsg, "QQuickChangeSet(Remove(0,12) Remove(5,4) Insert(3,9) Insert(15,2) Change(24,8) )"); - qDebug() << changeSet; - - changeSet.clear(); - - QTest::ignoreMessage(QtDebugMsg, "QQuickChangeSet(Remove(12,4,0,0) Insert(5,4,0,0) )"); - - changeSet.move(12, 5, 4, 0); - qDebug() << changeSet; -} - -void tst_qquickchangeset::random_data() -{ - QTest::addColumn("seed"); - QTest::addColumn("combinations"); - QTest::addColumn("depth"); - QTest::newRow("1*5") << 32 << 1 << 5; - QTest::newRow("2*2") << 32 << 2 << 2; - QTest::newRow("3*2") << 32 << 3 << 2; - QTest::newRow("3*5") << 32 << 3 << 5; -} - -void tst_qquickchangeset::random() -{ - QFETCH(int, seed); - QFETCH(int, combinations); - QFETCH(int, depth); - - qsrand(seed); - - int failures = 0; - for (int i = 0; i < 20000; ++i) { - QQuickChangeSet accumulatedSet; - SignalList input; - - int modelCount = 40; - int moveCount = 0; - - for (int j = 0; j < combinations; ++j) { - QQuickChangeSet set; - for (int k = 0; k < depth; ++k) { - switch (-(qrand() % 3)) { - case InsertOp: { - int index = qrand() % (modelCount + 1); - int count = qrand() % 5 + 1; - set.insert(index, count); - input.append(Insert(index, count)); - modelCount += count; - break; - } - case RemoveOp: { - const int index = qrand() % (modelCount + 1); - const int count = qrand() % (modelCount - index + 1); - set.remove(index, count); - input.append(Remove(index, count)); - modelCount -= count; - break; - } - case MoveOp: { - const int from = qrand() % (modelCount + 1); - const int count = qrand() % (modelCount - from + 1); - const int to = qrand() % (modelCount - count + 1); - const int moveId = moveCount++; - set.move(from, to, count, moveId); - input.append(Move(from, to, count, moveId)); - break; - } - default: - break; - } - } - accumulatedSet.apply(set); - } - - SignalList output; - foreach (const QQuickChangeSet::Remove &remove, accumulatedSet.removes()) - output << Remove(remove.index, remove.count, remove.moveId, remove.offset); - foreach (const QQuickChangeSet::Insert &insert, accumulatedSet.inserts()) - output << Insert(insert.index, insert.count, insert.moveId, insert.offset); - - QVector inputList; - for (int i = 0; i < 40; ++i) - inputList.append(i); - QVector outputList = inputList; - if (!applyChanges(inputList, input)) { - qDebug() << "Invalid input list"; - qDebug() << input; - qDebug() << inputList; - ++failures; - } else if (!applyChanges(outputList, output)) { - qDebug() << "Invalid output list"; - qDebug() << input; - qDebug() << output; - qDebug() << outputList; - ++failures; - } else if (outputList != inputList) { - qDebug() << "Input/output mismatch"; - qDebug() << input; - qDebug() << output; - qDebug() << inputList; - qDebug() << outputList; - ++failures; - } - } - QCOMPARE(failures, 0); -} - -QTEST_MAIN(tst_qquickchangeset) - -#include "tst_qquickchangeset.moc" diff --git a/tests/auto/qml/qquicklistcompositor/qquicklistcompositor.pro b/tests/auto/qml/qquicklistcompositor/qquicklistcompositor.pro deleted file mode 100644 index 9d1d2bd237..0000000000 --- a/tests/auto/qml/qquicklistcompositor/qquicklistcompositor.pro +++ /dev/null @@ -1,10 +0,0 @@ -CONFIG += testcase -TARGET = tst_qquicklistcompositor -macx:CONFIG -= app_bundle - -SOURCES += tst_qquicklistcompositor.cpp - -CONFIG += parallel_test - -QT += core-private gui-private qml-private quick-private testlib -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/qml/qquicklistcompositor/tst_qquicklistcompositor.cpp b/tests/auto/qml/qquicklistcompositor/tst_qquicklistcompositor.cpp deleted file mode 100644 index 5be501c94e..0000000000 --- a/tests/auto/qml/qquicklistcompositor/tst_qquicklistcompositor.cpp +++ /dev/null @@ -1,1740 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include -#include - -template int lengthOf(const T (&)[N]) { return N; } - -typedef QQuickListCompositor C; - -struct Range -{ - Range() {} - Range(void *list, int index, int count, int flags) - : list(list), index(index), count(count), flags(flags) {} - void *list; - int index; - int count; - int flags; -}; - -template struct Array -{ - Array() : array(0), count(0) {} - template Array(const T (&array)[N]) : array(array), count(N) {} - - T operator [](int index) const { return array[index]; } - - const T *array; - int count; -}; - -typedef Array IndexArray; -typedef Array ListArray; - -typedef QVector RemoveList; -typedef QVector InsertList; -typedef QVector ChangeList; - -typedef QVector RangeList; - -Q_DECLARE_METATYPE(RangeList) -Q_DECLARE_METATYPE(RemoveList) -Q_DECLARE_METATYPE(InsertList) -Q_DECLARE_METATYPE(ChangeList) -Q_DECLARE_METATYPE(void *) -Q_DECLARE_METATYPE(IndexArray) -Q_DECLARE_METATYPE(ListArray) -Q_DECLARE_METATYPE(C::Group) - -QT_BEGIN_NAMESPACE -bool operator ==(const C::Change &left, const C::Change &right) -{ - return left.index[3] == right.index[3] - && left.index[2] == right.index[2] - && left.index[1] == right.index[1] - && left.index[0] == right.index[0] - && left.count == right.count - && left.groups() == right.groups() - && left.inCache() == right.inCache() - && (left.moveId == -1) == (right.moveId == -1); -} -QT_END_NAMESPACE - -static const C::Group Visible = C::Group(2); -static const C::Group Selection = C::Group(3); - -class tst_qquicklistcompositor : public QObject -{ - Q_OBJECT - - enum { - VisibleFlag = 0x04, - SelectionFlag = 0x08 - }; - - void populateChange( - C::Change &change, int sIndex, int vIndex, int dIndex, int cIndex, int count, int flags, int moveId) - { - change.index[Selection] = sIndex; - change.index[Visible] = vIndex; - change.index[C::Default] = dIndex; - change.index[C::Cache] = cIndex; - change.count = count; - change.flags = flags; - change.moveId = moveId; - } - - C::Remove Remove( - int sIndex, int vIndex, int dIndex, int cIndex, int count, int flags, int moveId = -1) - { - C::Remove remove; - populateChange(remove, sIndex, vIndex, dIndex, cIndex, count, flags, moveId); - return remove; - } - - C::Insert Insert( - int sIndex, int vIndex, int dIndex, int cIndex, int count, int flags, int moveId = -1) - { - C::Insert insert; - populateChange(insert, sIndex, vIndex, dIndex, cIndex, count, flags, moveId); - return insert; - } - - C::Change Change( - int sIndex, int vIndex, int dIndex, int cIndex, int count, int flags, int moveId = -1) - { - C::Change change; - populateChange(change, sIndex, vIndex, dIndex, cIndex, count, flags, moveId); - return change; - } - -private slots: - void find_data(); - void find(); - void findInsertPosition_data(); - void findInsertPosition(); - void insert(); - void clearFlags_data(); - void clearFlags(); - void setFlags_data(); - void setFlags(); - void move_data(); - void move(); - void moveFromEnd(); - void clear(); - void listItemsInserted_data(); - void listItemsInserted(); - void listItemsRemoved_data(); - void listItemsRemoved(); - void listItemsMoved_data(); - void listItemsMoved(); - void listItemsChanged_data(); - void listItemsChanged(); - void compositorDebug(); - void changeDebug(); - void groupDebug(); -}; - -void tst_qquicklistcompositor::find_data() -{ - QTest::addColumn("ranges"); - QTest::addColumn("startGroup"); - QTest::addColumn("startIndex"); - QTest::addColumn("group"); - QTest::addColumn("index"); - QTest::addColumn("selectionIndex"); - QTest::addColumn("visibleIndex"); - QTest::addColumn("defaultIndex"); - QTest::addColumn("cacheIndex"); - QTest::addColumn("rangeFlags"); - QTest::addColumn("rangeIndex"); - - int listA; void *a = &listA; - - QTest::newRow("Start") - << (RangeList() - << Range(a, 0, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 1, 1, int(C::AppendFlag | C::PrependFlag | C::CacheFlag)) - << Range(0, 0, 1, int(VisibleFlag| C::CacheFlag))) - << C::Cache << 2 - << Selection << 0 - << 0 << 0 << 0 << 0 - << uint(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag) << 0; -} - -void tst_qquicklistcompositor::find() -{ - QFETCH(RangeList, ranges); - QFETCH(C::Group, startGroup); - QFETCH(int, startIndex); - QFETCH(C::Group, group); - QFETCH(int, index); - QFETCH(int, cacheIndex); - QFETCH(int, defaultIndex); - QFETCH(int, visibleIndex); - QFETCH(int, selectionIndex); - QFETCH(uint, rangeFlags); - QFETCH(int, rangeIndex); - - QQuickListCompositor compositor; - compositor.setGroupCount(4); - compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); - - foreach (const Range &range, ranges) - compositor.append(range.list, range.index, range.count, range.flags); - - compositor.find(startGroup, startIndex); - - QQuickListCompositor::iterator it = compositor.find(group, index); - QCOMPARE(it.index[C::Cache], cacheIndex); - QCOMPARE(it.index[C::Default], defaultIndex); - QCOMPARE(it.index[Visible], visibleIndex); - QCOMPARE(it.index[Selection], selectionIndex); - QCOMPARE(it->flags, rangeFlags); - QCOMPARE(it->index, rangeIndex); -} - -void tst_qquicklistcompositor::findInsertPosition_data() -{ - QTest::addColumn("ranges"); - QTest::addColumn("group"); - QTest::addColumn("index"); - QTest::addColumn("selectionIndex"); - QTest::addColumn("visibleIndex"); - QTest::addColumn("defaultIndex"); - QTest::addColumn("cacheIndex"); - QTest::addColumn("rangeFlags"); - QTest::addColumn("rangeIndex"); - - int listA; void *a = &listA; - - QTest::newRow("Start") - << (RangeList() - << Range(a, 0, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 1, 1, int(C::AppendFlag | C::PrependFlag | C::CacheFlag)) - << Range(0, 0, 1, int(VisibleFlag| C::CacheFlag))) - << Selection << 0 - << 0 << 0 << 0 << 0 - << uint(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag) << 0; - QTest::newRow("1") - << (RangeList() - << Range(a, 0, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 1, 1, int(C::AppendFlag | C::PrependFlag | C::CacheFlag)) - << Range(0, 0, 1, int(VisibleFlag| C::CacheFlag))) - << Selection << 1 - << 1 << 1 << 1 << 3 - << uint(0) << 0; -} - -void tst_qquicklistcompositor::findInsertPosition() -{ - QFETCH(RangeList, ranges); - QFETCH(C::Group, group); - QFETCH(int, index); - QFETCH(int, cacheIndex); - QFETCH(int, defaultIndex); - QFETCH(int, visibleIndex); - QFETCH(int, selectionIndex); - QFETCH(uint, rangeFlags); - QFETCH(int, rangeIndex); - - QQuickListCompositor compositor; - compositor.setGroupCount(4); - compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); - - foreach (const Range &range, ranges) - compositor.append(range.list, range.index, range.count, range.flags); - - QQuickListCompositor::insert_iterator it = compositor.findInsertPosition(group, index); - - QCOMPARE(it.index[C::Cache], cacheIndex); - QCOMPARE(it.index[C::Default], defaultIndex); - QCOMPARE(it.index[Visible], visibleIndex); - QCOMPARE(it.index[Selection], selectionIndex); - QCOMPARE(it->flags, rangeFlags); - QCOMPARE(it->index, rangeIndex); -} - -void tst_qquicklistcompositor::insert() -{ - QQuickListCompositor compositor; - compositor.setGroupCount(4); - compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); - - C::iterator it; - - int listA; int *a = &listA; - int listB; int *b = &listB; - int listC; int *c = &listC; - - { - compositor.append(a, 0, 12, C::AppendFlag | C::PrependFlag | C::DefaultFlag); - const int indexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - const int *lists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; - QCOMPARE(compositor.count(C::Default), lengthOf(indexes)); - for (int i = 0; i < lengthOf(indexes); ++i) { - it = compositor.find(C::Default, i); - QCOMPARE(it.list(), lists[i]); - if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); - } - } { - compositor.append(b, 4, 4, C::DefaultFlag); - const int indexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,4,5,6,7}; - const int *lists[] = {a,a,a,a,a,a,a,a,a,a, a, a,b,b,b,b}; - QCOMPARE(compositor.count(C::Default), lengthOf(indexes)); - for (int i = 0; i < lengthOf(indexes); ++i) { - it = compositor.find(C::Default, i); - QCOMPARE(it.list(), lists[i]); - if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); - } - } { // Insert at end. - compositor.insert( - C::Default, 16, c, 2, 2, C::DefaultFlag); - const int indexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,4,5,6,7,2,3}; - const int *lists[] = {a,a,a,a,a,a,a,a,a,a, a, a,b,b,b,b,c,c}; - QCOMPARE(compositor.count(C::Default), lengthOf(indexes)); - for (int i = 0; i < lengthOf(indexes); ++i) { - it = compositor.find(C::Default, i); - QCOMPARE(it.list(), lists[i]); - if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); - } - } { // Insert at start - compositor.insert( - C::Default, 0, c, 6, 4, C::DefaultFlag); - const int indexes[] = {6,7,8,9,0,1,2,3,4,5,6,7,8,9,10,11,4,5,6,7,2,3}; - const int *lists[] = {c,c,c,c,a,a,a,a,a,a,a,a,a,a, a, a,b,b,b,b,c,c}; - for (int i = 0; i < lengthOf(indexes); ++i) { - it = compositor.find(C::Default, i); - QCOMPARE(it.list(), lists[i]); - if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); - } - } { // Insert after static range. - compositor.insert( - C::Default, 4, b, 0, 8, C::AppendFlag | C::PrependFlag | C::DefaultFlag); - const int indexes[] = {6,7,8,9,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,8,9,10,11,4,5,6,7,2,3}; - const int *lists[] = {c,c,c,c,b,b,b,b,b,b,b,b,a,a,a,a,a,a,a,a,a,a, a, a,b,b,b,b,c,c}; - QCOMPARE(compositor.count(C::Default), lengthOf(indexes)); - for (int i = 0; i < lengthOf(indexes); ++i) { - it = compositor.find(C::Default, i); - QCOMPARE(it.list(), lists[i]); - if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); - } - } { // Insert at end of dynamic range. - compositor.insert( - C::Default, 12, c, 0, 4, C::AppendFlag | C::PrependFlag | C::DefaultFlag); - const int indexes[] = {6,7,8,9,0,1,2,3,4,5,6,7,0,1,2,3,0,1,2,3,4,5,6,7,8,9,10,11,4,5,6,7,2,3}; - const int *lists[] = {c,c,c,c,b,b,b,b,b,b,b,b,c,c,c,c,a,a,a,a,a,a,a,a,a,a, a, a,b,b,b,b,c,c}; - QCOMPARE(compositor.count(C::Default), lengthOf(indexes)); - for (int i = 0; i < lengthOf(indexes); ++i) { - it = compositor.find(C::Default, i); - QCOMPARE(it.list(), lists[i]); - if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); - } - } { // Insert into range. - compositor.insert( - C::Default, 8, c, 0, 4, C::AppendFlag | C::PrependFlag | C::DefaultFlag); - const int indexes[] = {6,7,8,9,0,1,2,3,0,1,2,3,4,5,6,7,0,1,2,3,0,1,2,3,4,5,6,7,8,9,10,11,4,5,6,7,2,3}; - const int *lists[] = {c,c,c,c,b,b,b,b,c,c,c,c,b,b,b,b,c,c,c,c,a,a,a,a,a,a,a,a,a,a, a, a,b,b,b,b,c,c}; - QCOMPARE(compositor.count(C::Default), lengthOf(indexes)); - for (int i = 0; i < lengthOf(indexes); ++i) { - it = compositor.find(C::Default, i); - QCOMPARE(it.list(), lists[i]); - if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]); - } - } -} - -void tst_qquicklistcompositor::clearFlags_data() -{ - QTest::addColumn("ranges"); - QTest::addColumn("group"); - QTest::addColumn("index"); - QTest::addColumn("count"); - QTest::addColumn("flags"); - QTest::addColumn("expectedRemoves"); - QTest::addColumn("cacheIndexes"); - QTest::addColumn("cacheLists"); - QTest::addColumn("defaultIndexes"); - QTest::addColumn("defaultLists"); - QTest::addColumn("visibleIndexes"); - QTest::addColumn("visibleLists"); - QTest::addColumn("selectionIndexes"); - QTest::addColumn("selectionLists"); - - int listA; void *a = &listA; - - { static const int cacheIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0,0}; - static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0,0}; - static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0,0}; - static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0,0}; - static const int visibleIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0,0}; - static const void *visibleLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0,0}; - static const int selectionIndexes[] = {0,1,4,5,6,7,8,9,10,11,0,0,0,0}; - static const void *selectionLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0,0}; - QTest::newRow("Default, 2, 2, Selection") - << (RangeList() - << Range(a, 0, 12, int(C::AppendFlag | C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << Range(0, 0, 4, int(SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag))) - << C::Default << 2 << 2 << int(SelectionFlag) - << (RemoveList() - << Remove(2, 2, 2, 2, 2, SelectionFlag | C::CacheFlag)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray(visibleIndexes) << ListArray(visibleLists) - << IndexArray(selectionIndexes) << ListArray(selectionLists); - } { static const int cacheIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0,0}; - static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0,0}; - static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0,0}; - static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0,0}; - static const int visibleIndexes[] = {0,2,3,5,6,7,8,9,10,11,0,0,0,0}; - static const void *visibleLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0,0}; - static const int selectionIndexes[] = {0,1,4,5,6,7,8,9,10,11,0,0,0,0}; - static const void *selectionLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0,0}; - QTest::newRow("Selection, 1, 2, Visible") - << (RangeList() - << Range(a, 0, 2, int(C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 2, 2, int(C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 4, 8, int(C::AppendFlag | C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << Range(0, 0, 4, int(SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag))) - << Selection << 1 << 2 << int(VisibleFlag) - << (RemoveList() - << Remove(1, 1, 1, 1, 1, VisibleFlag | C::CacheFlag) - << Remove(2, 3, 4, 4, 1, VisibleFlag | C::CacheFlag)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray(visibleIndexes) << ListArray(visibleLists) - << IndexArray(selectionIndexes) << ListArray(selectionLists); - } { static const int cacheIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0,0}; - static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0,0}; - static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0}; - static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0}; - static const int visibleIndexes[] = {0,2,3,5,6,7,8,9,10,11,0,0,0}; - static const void *visibleLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0}; - static const int selectionIndexes[] = {0,1,4,5,6,7,8,9,10,11,0,0,0}; - static const void *selectionLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0}; - QTest::newRow("Default, 13, 1, Prepend | Selection | Visible | Default") - << (RangeList() - << Range(a, 0, 1, int(C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 1, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 2, 2, int(C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 4, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 5, 7, int(C::AppendFlag | C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << Range(0, 0, 4, int(SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag))) - << C::Default << 13 << 1 << int(C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag) - << (RemoveList() - << Remove(11, 11, 13, 13, 1, SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray(visibleIndexes) << ListArray(visibleLists) - << IndexArray(selectionIndexes) << ListArray(selectionLists); - } { static const int cacheIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,0}; - static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a,a, a,0}; - static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,0,0}; - static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a,0,0,0}; - static const int visibleIndexes[] = {0,2,3,5,6,7,8,9,10,11,0,0,0}; - static const void *visibleLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0}; - static const int selectionIndexes[] = {0,1,4,5,6,7,8,9,10,11,0,0,0}; - static const void *selectionLists[] = {a,a,a,a,a,a,a,a, a, a,0,0,0}; - QTest::newRow("Cache, 11, 4, Cache") - << (RangeList() - << Range(a, 0, 1, int(C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 1, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 2, 2, int(C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 4, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 5, 7, int(C::AppendFlag | C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << Range(0, 0, 1, int(C::CacheFlag)) - << Range(0, 0, 3, int(SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag))) - << C::Cache << 11 << 4 << int(C::CacheFlag) - << (RemoveList()) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray(visibleIndexes) << ListArray(visibleLists) - << IndexArray(selectionIndexes) << ListArray(selectionLists); - } { static const int cacheIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,0}; - static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a,a, a,0}; - static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,0}; - static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a,0}; - static const int visibleIndexes[] = {0,2,3,5,6,7,8,9,10,0}; - static const void *visibleLists[] = {a,a,a,a,a,a,a,a, a,0}; - static const int selectionIndexes[] = {0,1,4,5,6,7,8,9,10,0}; - static const void *selectionLists[] = {a,a,a,a,a,a,a,a, a,0}; - QTest::newRow("Default, 11, 3, Default | Visible | Selection") - << (RangeList() - << Range(a, 0, 1, int(C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 1, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 2, 2, int(C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 4, 1, int(C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 5, 6, int(C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << Range(a, 11, 1, int(C::AppendFlag | C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag)) - << Range(0, 0, 2, int(SelectionFlag | VisibleFlag | C::DefaultFlag)) - << Range(0, 0, 1, int(SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag))) - << C::Default << 11 << 3 << int(C::DefaultFlag | VisibleFlag| SelectionFlag) - << (RemoveList() - << Remove(9, 9, 11, 11, 1, SelectionFlag | VisibleFlag | C::DefaultFlag) - << Remove(9, 9, 11, 11, 2, SelectionFlag | VisibleFlag | C::DefaultFlag)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray(visibleIndexes) << ListArray(visibleLists) - << IndexArray(selectionIndexes) << ListArray(selectionLists); - } -} - -void tst_qquicklistcompositor::clearFlags() -{ - QFETCH(RangeList, ranges); - QFETCH(C::Group, group); - QFETCH(int, index); - QFETCH(int, count); - QFETCH(int, flags); - QFETCH(RemoveList, expectedRemoves); - QFETCH(IndexArray, cacheIndexes); - QFETCH(ListArray, cacheLists); - QFETCH(IndexArray, defaultIndexes); - QFETCH(ListArray, defaultLists); - QFETCH(IndexArray, visibleIndexes); - QFETCH(ListArray, visibleLists); - QFETCH(IndexArray, selectionIndexes); - QFETCH(ListArray, selectionLists); - - QQuickListCompositor compositor; - compositor.setGroupCount(4); - compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); - - foreach (const Range &range, ranges) - compositor.append(range.list, range.index, range.count, range.flags); - - QVector removes; - compositor.clearFlags(group, index, count, flags, &removes); - - QCOMPARE(removes, expectedRemoves); - - QCOMPARE(compositor.count(C::Cache), cacheIndexes.count); - for (int i = 0; i < cacheIndexes.count; ++i) { - C::iterator it = compositor.find(C::Cache, i); - QCOMPARE(it->list, cacheLists[i]); - if (cacheLists[i]) - QCOMPARE(it.modelIndex(), cacheIndexes[i]); - } - QCOMPARE(compositor.count(C::Default), defaultIndexes.count); - for (int i = 0; i < defaultIndexes.count; ++i) { - C::iterator it = compositor.find(C::Default, i); - QCOMPARE(it->list, defaultLists[i]); - if (defaultLists[i]) - QCOMPARE(it.modelIndex(), defaultIndexes[i]); - } - QCOMPARE(compositor.count(Visible), visibleIndexes.count); - for (int i = 0; i < visibleIndexes.count; ++i) { - C::iterator it = compositor.find(Visible, i); - QCOMPARE(it->list, visibleLists[i]); - if (visibleLists[i]) - QCOMPARE(it.modelIndex(), visibleIndexes[i]); - } - QCOMPARE(compositor.count(Selection), selectionIndexes.count); - for (int i = 0; i < selectionIndexes.count; ++i) { - C::iterator it = compositor.find(Selection, i); - QCOMPARE(it->list, selectionLists[i]); - if (selectionLists[i]) - QCOMPARE(it.modelIndex(), selectionIndexes[i]); - } -} - -void tst_qquicklistcompositor::setFlags_data() -{ - QTest::addColumn("ranges"); - QTest::addColumn("group"); - QTest::addColumn("index"); - QTest::addColumn("count"); - QTest::addColumn("flags"); - QTest::addColumn("expectedInserts"); - QTest::addColumn("cacheIndexes"); - QTest::addColumn("cacheLists"); - QTest::addColumn("defaultIndexes"); - QTest::addColumn("defaultLists"); - QTest::addColumn("visibleIndexes"); - QTest::addColumn("visibleLists"); - QTest::addColumn("selectionIndexes"); - QTest::addColumn("selectionLists"); - - int listA; void *a = &listA; - - { static const int cacheIndexes[] = {0,0,0,0}; - static const void *cacheLists[] = {0,0,0,0}; - static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; - QTest::newRow("Default, 2, 2, Default") - << (RangeList() - << Range(a, 0, 12, C::DefaultFlag) - << Range(0, 0, 4, C::CacheFlag)) - << C::Default << 2 << 2 << int(C::DefaultFlag) - << (InsertList()) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray() << ListArray() - << IndexArray() << ListArray(); - } { static const int cacheIndexes[] = {0,0,0,0}; - static const void *cacheLists[] = {0,0,0,0}; - static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; - static const int visibleIndexes[] = {2,3}; - static const void *visibleLists[] = {a,a}; - QTest::newRow("Default, 2, 2, Visible") - << (RangeList() - << Range(a, 0, 12, C::DefaultFlag) - << Range(0, 0, 4, C::CacheFlag)) - << C::Default << 2 << 2 << int(VisibleFlag) - << (InsertList() - << Insert(0, 0, 2, 0, 2, VisibleFlag)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray(visibleIndexes) << ListArray(visibleLists) - << IndexArray() << ListArray(); - } { static const int cacheIndexes[] = {3,6,0,0,0,0}; - static const void *cacheLists[] = {a,a,0,0,0,0}; - static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; - static const int visibleIndexes[] = {2,3,6,7}; - static const void *visibleLists[] = {a,a,a,a}; - static const int selectionIndexes[] = {3,6}; - static const void *selectionLists[] = {a,a}; - QTest::newRow("Visible, 1, 2, Selection | Cache") - << (RangeList() - << Range(a, 0, 2, C::DefaultFlag) - << Range(a, 2, 2, VisibleFlag | C::DefaultFlag) - << Range(a, 4, 2, C::DefaultFlag) - << Range(a, 6, 2, VisibleFlag | C::DefaultFlag) - << Range(a, 8, 4, C::DefaultFlag) - << Range(0, 0, 4, C::CacheFlag)) - << Visible << 1 << 2 << int(SelectionFlag | C::CacheFlag) - << (InsertList() - << Insert(0, 1, 3, 0, 1, SelectionFlag | C::CacheFlag) - << Insert(1, 2, 6, 1, 1, SelectionFlag | C::CacheFlag)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray(visibleIndexes) << ListArray(visibleLists) - << IndexArray(selectionIndexes) << ListArray(selectionLists); - } { static const int cacheIndexes[] = {3,6,0,0,0,0}; - static const void *cacheLists[] = {a,a,0,0,0,0}; - static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; - static const int visibleIndexes[] = {2,3,6,7,0}; - static const void *visibleLists[] = {a,a,a,a,0}; - static const int selectionIndexes[] = {3,6}; - static const void *selectionLists[] = {a,a}; - QTest::newRow("Cache, 3, 1, Visible") - << (RangeList() - << Range(a, 0, 2, C::DefaultFlag) - << Range(a, 2, 1, VisibleFlag | C::DefaultFlag) - << Range(a, 3, 1, SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 4, 2, C::DefaultFlag) - << Range(a, 6, 1, SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 7, 1, VisibleFlag | C::DefaultFlag) - << Range(a, 8, 4, C::DefaultFlag) - << Range(0, 0, 4, C::CacheFlag)) - << C::Cache << 3 << 1 << int(VisibleFlag) - << (InsertList() - << Insert(2, 4, 12, 3, 1, VisibleFlag | C::CacheFlag)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray(visibleIndexes) << ListArray(visibleLists) - << IndexArray(selectionIndexes) << ListArray(selectionLists); - } { static const int cacheIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; - static const int defaultIndexes[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a,a, a, a}; - static const int visibleIndexes[] = {0,1,3,4,5,6,7,8,9,10,11}; - static const void *visibleLists[] = {a,a,a,a,a,a,a,a,a, a, a}; - static const int selectionIndexes[] = {2,6,7,8,9}; - static const void *selectionLists[] = {a,a,a,a,a}; - QTest::newRow("Existing flag, sparse selection") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 2, 1, C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 3, 3, C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 6, 4, C::PrependFlag | SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) - << Range(a,10, 2, C::AppendFlag | C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag)) - << C::Cache << 3 << 1 << int(VisibleFlag) - << InsertList() - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray(visibleIndexes) << ListArray(visibleLists) - << IndexArray(selectionIndexes) << ListArray(selectionLists); - } -} - -void tst_qquicklistcompositor::setFlags() -{ - QFETCH(RangeList, ranges); - QFETCH(C::Group, group); - QFETCH(int, index); - QFETCH(int, count); - QFETCH(int, flags); - QFETCH(InsertList, expectedInserts); - QFETCH(IndexArray, cacheIndexes); - QFETCH(ListArray, cacheLists); - QFETCH(IndexArray, defaultIndexes); - QFETCH(ListArray, defaultLists); - QFETCH(IndexArray, visibleIndexes); - QFETCH(ListArray, visibleLists); - QFETCH(IndexArray, selectionIndexes); - QFETCH(ListArray, selectionLists); - - QQuickListCompositor compositor; - compositor.setGroupCount(4); - compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); - - foreach (const Range &range, ranges) - compositor.append(range.list, range.index, range.count, range.flags); - - QVector inserts; - compositor.setFlags(group, index, count, flags, &inserts); - - QCOMPARE(inserts, expectedInserts); - - QCOMPARE(compositor.count(C::Cache), cacheIndexes.count); - for (int i = 0; i < cacheIndexes.count; ++i) { - C::iterator it = compositor.find(C::Cache, i); - QCOMPARE(it->list, cacheLists[i]); - if (cacheLists[i]) - QCOMPARE(it.modelIndex(), cacheIndexes[i]); - } - QCOMPARE(compositor.count(C::Default), defaultIndexes.count); - for (int i = 0; i < defaultIndexes.count; ++i) { - C::iterator it = compositor.find(C::Default, i); - QCOMPARE(it->list, defaultLists[i]); - if (defaultLists[i]) - QCOMPARE(it.modelIndex(), defaultIndexes[i]); - } - QCOMPARE(compositor.count(Visible), visibleIndexes.count); - for (int i = 0; i < visibleIndexes.count; ++i) { - C::iterator it = compositor.find(Visible, i); - QCOMPARE(it->list, visibleLists[i]); - if (visibleLists[i]) - QCOMPARE(it.modelIndex(), visibleIndexes[i]); - } - QCOMPARE(compositor.count(Selection), selectionIndexes.count); - for (int i = 0; i < selectionIndexes.count; ++i) { - C::iterator it = compositor.find(Selection, i); - QCOMPARE(it->list, selectionLists[i]); - if (selectionLists[i]) - QCOMPARE(it.modelIndex(), selectionIndexes[i]); - } -} - -void tst_qquicklistcompositor::move_data() -{ - QTest::addColumn("ranges"); - QTest::addColumn("fromGroup"); - QTest::addColumn("from"); - QTest::addColumn("toGroup"); - QTest::addColumn("to"); - QTest::addColumn("count"); - QTest::addColumn("expectedRemoves"); - QTest::addColumn("expectedInserts"); - QTest::addColumn("cacheIndexes"); - QTest::addColumn("cacheLists"); - QTest::addColumn("defaultIndexes"); - QTest::addColumn("defaultLists"); - QTest::addColumn("visibleIndexes"); - QTest::addColumn("visibleLists"); - QTest::addColumn("selectionIndexes"); - QTest::addColumn("selectionLists"); - - int listA; void *a = &listA; - int listB; void *b = &listB; - int listC; void *c = &listC; - - { static const int cacheIndexes[] = {0,0,0,0,2,3}; - static const void *cacheLists[] = {0,0,0,0,c,c}; - static const int defaultIndexes[] = {0,0,1,2,3,4,5,0,1,2,3,4,5,1,2,3,0,1,2,3,4,5}; - static const void *defaultLists[] = {0,a,a,a,a,a,a,b,b,b,b,b,b,0,0,0,c,c,c,c,c,c}; - QTest::newRow("15, 0, 1") - << (RangeList() - << Range(a, 0, 6, C::DefaultFlag) - << Range(b, 0, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(0, 0, 4, C::DefaultFlag | C::CacheFlag) - << Range(c, 0, 2, C::PrependFlag | C::DefaultFlag) - << Range(c, 2, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(c, 4, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag)) - << C::Default << 15 << C::Default << 0 << 1 - << (RemoveList() - << Remove(0, 0, 15, 3, 1, C::DefaultFlag | C::CacheFlag, 0)) - << (InsertList() - << Insert(0, 0, 0, 0, 1, C::DefaultFlag | C::CacheFlag, 0)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray() << ListArray() - << IndexArray() << ListArray(); - } { static const int cacheIndexes[] = {0,0,0,0,2,3}; - static const void *cacheLists[] = {0,0,0,0,c,c}; - static const int defaultIndexes[] = {0,1,0,1,2,3,4,5,0,1,2,3,4,5,2,3,0,1,2,3,4,5}; - static const void *defaultLists[] = {0,0,a,a,a,a,a,a,b,b,b,b,b,b,0,0,c,c,c,c,c,c}; - QTest::newRow("15, 1, 1") - << (RangeList() - << Range(0, 0, 1, C::DefaultFlag | C::CacheFlag) - << Range(a, 0, 6, C::DefaultFlag) - << Range(b, 0, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(0, 0, 3, C::DefaultFlag | C::CacheFlag) - << Range(c, 0, 2, C::PrependFlag | C::DefaultFlag) - << Range(c, 2, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(c, 4, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag)) - << C::Default << 15 << C::Default << 1 << 1 - << (RemoveList() - << Remove(0, 0, 15, 3, 1, C::DefaultFlag | C::CacheFlag, 0)) - << (InsertList() - << Insert(0, 0, 1, 1, 1, C::DefaultFlag | C::CacheFlag, 0)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray() << ListArray() - << IndexArray() << ListArray(); - } { static const int cacheIndexes[] = {0,0,0,0,2,3}; - static const void *cacheLists[] = {0,0,0,0,c,c}; - static const int defaultIndexes[] = {0,1,2,0,1,3,4,5,0,1,2,3,4,5,2,3,0,1,2,3,4,5}; - static const void *defaultLists[] = {a,a,a,0,0,a,a,a,b,b,b,b,b,b,0,0,c,c,c,c,c,c}; - QTest::newRow("0, 3, 2") - << (RangeList() - << Range(0, 0, 2, C::DefaultFlag | C::CacheFlag) - << Range(a, 0, 6, C::DefaultFlag) - << Range(b, 0, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(0, 0, 2, C::DefaultFlag | C::CacheFlag) - << Range(c, 0, 2, C::PrependFlag | C::DefaultFlag) - << Range(c, 2, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(c, 4, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag)) - << C::Default << 0 << C::Default << 3 << 2 - << (RemoveList() - << Remove(0, 0, 0, 0, 2, C::DefaultFlag | C::CacheFlag, 0)) - << (InsertList() - << Insert(0, 0, 3, 0, 2, C::DefaultFlag | C::CacheFlag, 0)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray() << ListArray() - << IndexArray() << ListArray(); - } { static const int cacheIndexes[] = {0,0,0,0,2,3}; - static const void *cacheLists[] = {0,0,0,0,c,c}; - static const int defaultIndexes[] = {0,5,0,1,2,3,4,5,0,1,0,1,2,2,3,3,4,1,2,3,4,5}; - static const void *defaultLists[] = {a,a,b,b,b,b,b,b,0,0,c,a,a,0,0,a,a,c,c,c,c,c}; - QTest::newRow("7, 1, 10") - << (RangeList() - << Range(a, 0, 3, C::DefaultFlag) - << Range(0, 0, 2, C::DefaultFlag | C::CacheFlag) - << Range(a, 3, 3, C::DefaultFlag) - << Range(b, 0, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(0, 0, 2, C::DefaultFlag | C::CacheFlag) - << Range(c, 0, 2, C::PrependFlag | C::DefaultFlag) - << Range(c, 2, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(c, 4, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag)) - << C::Default << 7 << C::Default << 1 << 10 - << (RemoveList() - << Remove(0, 0, 7, 2, 1, C::DefaultFlag, 0) - << Remove(0, 0, 7, 2, 6, C::DefaultFlag, 1) - << Remove(0, 0, 7, 2, 2, C::DefaultFlag | C::CacheFlag, 2) - << Remove(0, 0, 7, 2, 1, C::DefaultFlag, 3)) - << (InsertList() - << Insert(0, 0, 1, 0, 1, C::DefaultFlag, 0) - << Insert(0, 0, 2, 0, 6, C::DefaultFlag, 1) - << Insert(0, 0, 8, 0, 2, C::DefaultFlag | C::CacheFlag, 2) - << Insert(0, 0, 10, 2, 1, C::DefaultFlag, 3)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray() << ListArray() - << IndexArray() << ListArray(); - } { static const int cacheIndexes[] = {0,0,0,0,3,2}; - static const void *cacheLists[] = {0,0,0,0,c,c}; - static const int defaultIndexes[] = {0,5,0,1,2,3,4,5,0,1,0,1,2,2,3,3,4,3,4,5,1,2}; - static const void *defaultLists[] = {a,a,b,b,b,b,b,b,0,0,c,a,a,0,0,a,a,c,c,c,c,c}; - QTest::newRow("17, 20, 2") - << (RangeList() - << Range(a, 0, 1, C::DefaultFlag) - << Range(a, 5, 1, C::DefaultFlag) - << Range(b, 0, 6, C::DefaultFlag) - << Range(0, 0, 2, C::DefaultFlag | C::CacheFlag) - << Range(c, 0, 1, C::DefaultFlag) - << Range(a, 1, 2, C::DefaultFlag) - << Range(0, 0, 2, C::DefaultFlag | C::CacheFlag) - << Range(a, 3, 2, C::DefaultFlag) - << Range(b, 0, 6, C::AppendFlag | C::PrependFlag) - << Range(c, 0, 1, C::PrependFlag) - << Range(c, 1, 1, C::PrependFlag | C::DefaultFlag) - << Range(c, 2, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(c, 4, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag)) - << C::Default << 17 << C::Default << 20 << 2 - << (RemoveList() - << Remove(0, 0, 17, 4, 1, C::DefaultFlag, 0) - << Remove(0, 0, 17, 4, 1, C::DefaultFlag | C::CacheFlag, 1)) - << (InsertList() - << Insert(0, 0, 20, 5, 1, C::DefaultFlag, 0) - << Insert(0, 0, 21, 5, 1, C::DefaultFlag | C::CacheFlag, 1)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray() << ListArray() - << IndexArray() << ListArray(); - } { static const int cacheIndexes[] = {8,9,10,4,11,0,1,2,3,5,6,7}; - static const void *cacheLists[] = {a,a, a,a, a,a,a,a,a,a,a,a}; - static const int defaultIndexes[] = {8,9,10,4,11,0,1,2,3,5,6,7}; - static const void *defaultLists[] = {a,a, a,a, a,a,a,a,a,a,a,a}; - static const int visibleIndexes[] = {8,9,10,4,11,0,1,2,3,5,6,7}; - static const void *visibleLists[] = {a,a, a,a, a,a,a,a,a,a,a,a}; - QTest::newRow("3, 4, 5") - << (RangeList() - << Range(a, 8, 4, VisibleFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 0, 2, C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 2, 1, C::PrependFlag) - << Range(a, 2, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 3, 5, C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 8, 4, C::AppendFlag | C::PrependFlag)) - << C::Default << 3 << C::Default << 4 << 5 - << (RemoveList() - << Remove(0, 3, 3, 3, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 0) - << Remove(0, 3, 3, 3, 2, VisibleFlag | C::DefaultFlag | C::CacheFlag, 1) - << Remove(0, 3, 3, 3, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 2) - << Remove(0, 3, 3, 3, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 3)) - << (InsertList() - << Insert(0, 4, 4, 4, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 0) - << Insert(0, 5, 5, 5, 2, VisibleFlag | C::DefaultFlag | C::CacheFlag, 1) - << Insert(0, 7, 7, 7, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 2) - << Insert(0, 8, 8, 8, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 3)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray(visibleIndexes) << ListArray(visibleLists) - << IndexArray() << ListArray(); - } { static const int cacheIndexes[] = {0,1}; - static const void *cacheLists[] = {a,a}; - static const int defaultIndexes[] = {0,1}; - static const void *defaultLists[] = {a,a}; - QTest::newRow("0, 1, 1") - << (RangeList() - << Range(a, 0, 1, C::PrependFlag) - << Range(a, 1, 1, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 2, 0, C::AppendFlag | C::PrependFlag) - << Range(a, 0, 1, C::DefaultFlag | C::CacheFlag)) - << C::Default << 0 << C::Default << 1 << 1 - << (RemoveList() - << Remove(0, 0, 0, 0, 1, C::DefaultFlag | C::CacheFlag, 0)) - << (InsertList() - << Insert(0, 0, 1, 1, 1, C::DefaultFlag | C::CacheFlag, 0)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray() << ListArray() - << IndexArray() << ListArray(); - } { static const int cacheIndexes[] = {1,2,3,4,5,6,0,8,9}; - static const void *cacheLists[] = {a,a,a,a,a,a,a,a,a}; - static const int defaultIndexes[] = {1,2,3,4,5,6,0,8,9}; - static const void *defaultLists[] = {a,a,a,a,a,a,a,a,a}; - static const int visibleIndexes[] = {0,7,10}; - static const void *visibleLists[] = {a,a, a}; - QTest::newRow("0, 6, 3") - << (RangeList() - << Range(a, 0, 1, C::PrependFlag) - << Range(a, 1, 6, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 0, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 7, 1, VisibleFlag) - << Range(a,10, 1, VisibleFlag) - << Range(a, 7, 1, C::PrependFlag) - << Range(a, 8, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) - << Visible << 0 << C::Default << 6 << 3 - << (RemoveList() - << Remove(0, 0, 6, 6, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 0) - << Remove(0, 0, 6, 6, 1, VisibleFlag, 1) - << Remove(0, 0, 6, 6, 1, VisibleFlag, 2)) - << (InsertList() - << Insert(0, 0, 6, 6, 1, VisibleFlag | C::DefaultFlag | C::CacheFlag, 0) - << Insert(0, 1, 7, 7, 1, VisibleFlag, 1) - << Insert(0, 2, 7, 7, 1, VisibleFlag, 2)) - << IndexArray(cacheIndexes) << ListArray(cacheLists) - << IndexArray(defaultIndexes) << ListArray(defaultLists) - << IndexArray(visibleIndexes) << ListArray(visibleLists) - << IndexArray() << ListArray(); - } -} - -void tst_qquicklistcompositor::move() -{ - QFETCH(RangeList, ranges); - QFETCH(C::Group, fromGroup); - QFETCH(int, from); - QFETCH(C::Group, toGroup); - QFETCH(int, to); - QFETCH(int, count); - QFETCH(RemoveList, expectedRemoves); - QFETCH(InsertList, expectedInserts); - QFETCH(IndexArray, cacheIndexes); - QFETCH(ListArray, cacheLists); - QFETCH(IndexArray, defaultIndexes); - QFETCH(ListArray, defaultLists); - QFETCH(IndexArray, visibleIndexes); - QFETCH(ListArray, visibleLists); - QFETCH(IndexArray, selectionIndexes); - QFETCH(ListArray, selectionLists); - - QQuickListCompositor compositor; - compositor.setGroupCount(4); - compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); - - foreach (const Range &range, ranges) - compositor.append(range.list, range.index, range.count, range.flags); - - QVector removes; - QVector inserts; - compositor.move(fromGroup, from, toGroup, to, count, fromGroup, &removes, &inserts); - - QCOMPARE(removes, expectedRemoves); - QCOMPARE(inserts, expectedInserts); - - QCOMPARE(compositor.count(C::Cache), cacheIndexes.count); - for (int i = 0; i < cacheIndexes.count; ++i) { - C::iterator it = compositor.find(C::Cache, i); - QCOMPARE(it->list, cacheLists[i]); - if (cacheLists[i]) - QCOMPARE(it.modelIndex(), cacheIndexes[i]); - } - QCOMPARE(compositor.count(C::Default), defaultIndexes.count); - for (int i = 0; i < defaultIndexes.count; ++i) { - C::iterator it = compositor.find(C::Default, i); - QCOMPARE(it->list, defaultLists[i]); - if (defaultLists[i]) - QCOMPARE(it.modelIndex(), defaultIndexes[i]); - } - QCOMPARE(compositor.count(Visible), visibleIndexes.count); - for (int i = 0; i < visibleIndexes.count; ++i) { - C::iterator it = compositor.find(Visible, i); - QCOMPARE(it->list, visibleLists[i]); - if (visibleLists[i]) - QCOMPARE(it.modelIndex(), visibleIndexes[i]); - } - QCOMPARE(compositor.count(Selection), selectionIndexes.count); - for (int i = 0; i < selectionIndexes.count; ++i) { - C::iterator it = compositor.find(Selection, i); - QCOMPARE(it->list, selectionLists[i]); - if (selectionLists[i]) - QCOMPARE(it.modelIndex(), selectionIndexes[i]); - } -} - -void tst_qquicklistcompositor::moveFromEnd() -{ - int listA; void *a = &listA; - - QQuickListCompositor compositor; - compositor.append(a, 0, 1, C::AppendFlag | C::PrependFlag | C::DefaultFlag); - - // Moving an item anchors it to that position. - compositor.move(C::Default, 0, C::Default, 0, 1, C::Default); - - // The existing item is anchored at 0 so prepending an item to the source will append it here - QVector inserts; - compositor.listItemsInserted(a, 0, 1, &inserts); - - QCOMPARE(inserts.count(), 1); - QCOMPARE(inserts.at(0).index[1], 1); - QCOMPARE(inserts.at(0).count, 1); - - C::iterator it; - it = compositor.find(C::Default, 0); - QCOMPARE(it.modelIndex(), 1); - - it = compositor.find(C::Default, 1); - QCOMPARE(it.modelIndex(), 0); -} - -void tst_qquicklistcompositor::clear() -{ - QQuickListCompositor compositor; - compositor.setGroupCount(4); - compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); - - int listA; void *a = &listA; - int listB; void *b = &listB; - - compositor.append(a, 0, 8, C::AppendFlag | C::PrependFlag | VisibleFlag | C::DefaultFlag); - compositor.append(b, 4, 5, VisibleFlag | C::DefaultFlag); - compositor.append(0, 0, 3, VisibleFlag | C::DefaultFlag | C::CacheFlag); - - QCOMPARE(compositor.count(C::Default), 16); - QCOMPARE(compositor.count(Visible), 16); - QCOMPARE(compositor.count(C::Cache), 3); - - compositor.clear(); - QCOMPARE(compositor.count(C::Default), 0); - QCOMPARE(compositor.count(Visible), 0); - QCOMPARE(compositor.count(C::Cache), 0); -} - -void tst_qquicklistcompositor::listItemsInserted_data() -{ - QTest::addColumn("ranges"); - QTest::addColumn("list"); - QTest::addColumn("index"); - QTest::addColumn("count"); - QTest::addColumn("expectedInserts"); - QTest::addColumn("cacheIndexes"); - QTest::addColumn("defaultIndexes"); - QTest::addColumn("visibleIndexes"); - QTest::addColumn("selectionIndexes"); - - int listA; void *a = &listA; - int listB; void *b = &listB; - - { static const int defaultIndexes[] = {/*A*/0,1,5,6,/*B*/0,1,2,3,/*A*/2,3,4}; - QTest::newRow("A 10, 2") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) - << Range(a, 2, 3, C::PrependFlag) - << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(b, 0, 4, C::DefaultFlag) - << Range(a, 2, 3, C::DefaultFlag)) - << a << 10 << 2 - << InsertList() - << IndexArray() - << IndexArray(defaultIndexes) - << IndexArray() - << IndexArray(); - } { static const int defaultIndexes[] = {/*A*/0,1,5,6,/*B*/0,1,2,3,/*A*/2,3,4}; - QTest::newRow("B 10, 2") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) - << Range(a, 2, 3, C::PrependFlag) - << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(b, 0, 4, C::DefaultFlag) - << Range(a, 2, 3, C::DefaultFlag)) - << b << 10 << 2 - << InsertList() - << IndexArray() - << IndexArray(defaultIndexes) - << IndexArray() - << IndexArray(); - } { static const int defaultIndexes[] = {/*A*/0,1,2,3,7,8,/*B*/0,1,2,3,/*A*/4,5,6}; - static const int visibleIndexes[] = {/*A*/0,1}; - QTest::newRow("A 0, 2") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) - << Range(a, 2, 3, C::PrependFlag) - << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(b, 0, 4, C::DefaultFlag) - << Range(a, 2, 3, C::DefaultFlag)) - << a << 0 << 2 - << (InsertList() - << Insert(0, 0, 0, 0, 2, VisibleFlag | C::DefaultFlag)) - << IndexArray() - << IndexArray(defaultIndexes) - << IndexArray(visibleIndexes) - << IndexArray(); - } { static const int defaultIndexes[] = {/*A*/0,1,2,3,5,8,9,/*B*/0,1,2,3,/*A*/4,6,7}; - static const int visibleIndexes[] = {/*A*/0,1,5}; - QTest::newRow("A 5, 1") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | VisibleFlag | C::DefaultFlag) - << Range(a, 2, 2, C::PrependFlag | C::DefaultFlag) - << Range(a, 4, 3, C::PrependFlag) - << Range(a, 7, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(b, 0, 4, C::DefaultFlag) - << Range(a, 4, 3, C::DefaultFlag)) - << a << 5 << 1 - << (InsertList() - << Insert(0, 2, 4, 0, 1, VisibleFlag | C::DefaultFlag)) - << IndexArray() - << IndexArray(defaultIndexes) - << IndexArray(visibleIndexes) - << IndexArray(); - } { static const int defaultIndexes[] = {/*A*/0,1,2,3,5,8,9,10,11,/*B*/0,1,2,3,/*A*/4,6,7}; - static const int visibleIndexes[] = {/*A*/0,1,5,10,11}; - QTest::newRow("A 10, 2") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | VisibleFlag | C::DefaultFlag) - << Range(a, 2, 2, C::PrependFlag | C::DefaultFlag) - << Range(a, 4, 1, C::PrependFlag) - << Range(a, 5, 1, C::PrependFlag | VisibleFlag | C::DefaultFlag) - << Range(a, 6, 2, C::PrependFlag) - << Range(a, 8, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(b, 0, 4, C::DefaultFlag) - << Range(a, 4, 1, C::DefaultFlag) - << Range(a, 6, 2, C::DefaultFlag)) - << a << 10 << 2 - << (InsertList() - << Insert(0, 3, 7, 0, 2, VisibleFlag | C::DefaultFlag)) - << IndexArray() - << IndexArray(defaultIndexes) - << IndexArray(visibleIndexes) - << IndexArray(); - } { static const int cacheIndexes[] = {/*A*/0,1,-1,-1,-1,2,5,6,7,8,9}; - static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6,7,8,9}; - static const int visibleIndexes[] = {/*A*/3,4}; - QTest::newRow("Insert after remove") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 2, 3, C::CacheFlag) - << Range(a, 2, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) - << a << 3 << 2 - << (InsertList() - << Insert(0, 0, 3, 6, 2, VisibleFlag | C::DefaultFlag)) - << IndexArray(cacheIndexes) - << IndexArray(defaultIndexes) - << IndexArray(visibleIndexes) - << IndexArray(); - } { static const int cacheIndexes[] = {/*A*/0,1,2,3,4}; - static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6}; - static const int visibleIndexes[] = {/*A*/0,1,2,3,4,5,6}; - QTest::newRow("Consecutive appends") - << (RangeList() - << Range(a, 0, 5, C::PrependFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 5, 1, C::PrependFlag | VisibleFlag | C::DefaultFlag) - << Range(a, 6, 0, C::AppendFlag | VisibleFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) - << a << 6 << 1 - << (InsertList() - << Insert(0, 6, 6, 5, 1, VisibleFlag | C::DefaultFlag)) - << IndexArray(cacheIndexes) - << IndexArray(defaultIndexes) - << IndexArray(visibleIndexes) - << IndexArray(); - } -} - -void tst_qquicklistcompositor::listItemsInserted() -{ - QFETCH(RangeList, ranges); - QFETCH(void *, list); - QFETCH(int, index); - QFETCH(int, count); - QFETCH(InsertList, expectedInserts); - QFETCH(IndexArray, cacheIndexes); - QFETCH(IndexArray, defaultIndexes); - QFETCH(IndexArray, visibleIndexes); - QFETCH(IndexArray, selectionIndexes); - - QQuickListCompositor compositor; - compositor.setGroupCount(4); - compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); - - foreach (const Range &range, ranges) - compositor.append(range.list, range.index, range.count, range.flags); - - QVector inserts; - compositor.listItemsInserted(list, index, count, &inserts); - - QCOMPARE(inserts, expectedInserts); - - QCOMPARE(compositor.count(C::Cache), cacheIndexes.count); - for (int i = 0; i < cacheIndexes.count; ++i) { - if (cacheIndexes[i] != -1) { - QCOMPARE(compositor.find(C::Cache, i).modelIndex(), cacheIndexes[i]); - } - } - QCOMPARE(compositor.count(C::Default), defaultIndexes.count); - for (int i = 0; i < defaultIndexes.count; ++i) { - if (defaultIndexes[i] != -1) { - QCOMPARE(compositor.find(C::Default, i).modelIndex(), defaultIndexes[i]); - } - } - QCOMPARE(compositor.count(Visible), visibleIndexes.count); - for (int i = 0; i < visibleIndexes.count; ++i) { - if (visibleIndexes[i] != -1) { - QCOMPARE(compositor.find(Visible, i).modelIndex(), visibleIndexes[i]); - } - } - QCOMPARE(compositor.count(Selection), selectionIndexes.count); - for (int i = 0; i < selectionIndexes.count; ++i) { - if (selectionIndexes[i] != -1) { - QCOMPARE(compositor.find(Selection, i).modelIndex(), selectionIndexes[i]); - } - } -} - -void tst_qquicklistcompositor::listItemsRemoved_data() -{ - QTest::addColumn("ranges"); - QTest::addColumn("list"); - QTest::addColumn("index"); - QTest::addColumn("count"); - QTest::addColumn("expectedRemoves"); - QTest::addColumn("cacheIndexes"); - QTest::addColumn("defaultIndexes"); - QTest::addColumn("visibleIndexes"); - QTest::addColumn("selectionIndexes"); - - int listA; void *a = &listA; - int listB; void *b = &listB; - - { static const int defaultIndexes[] = {/*A*/0,1,5,6,/*B*/0,1,2,3,/*A*/2,3,4}; - QTest::newRow("12, 2") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) - << Range(a, 2, 3, C::PrependFlag) - << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(b, 0, 4, C::DefaultFlag) - << Range(a, 2, 3, C::DefaultFlag)) - << a << 12 << 2 - << RemoveList() - << IndexArray() - << IndexArray(defaultIndexes) - << IndexArray() - << IndexArray(); - } { static const int defaultIndexes[] = {/*A*/0,1,/*B*/0,1,2,3,/*A*/2,3}; - QTest::newRow("4, 3") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) - << Range(a, 2, 3, C::PrependFlag) - << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(b, 0, 4, C::DefaultFlag) - << Range(a, 2, 3, C::DefaultFlag)) - << a << 4 << 3 - << (RemoveList() - << Remove(0, 0, 2, 0, 2, C::DefaultFlag) - << Remove(0, 0, 8, 0, 1, C::DefaultFlag)) - << IndexArray() - << IndexArray(defaultIndexes) - << IndexArray() - << IndexArray(); - } { static const int cacheIndexes[] = {/*A*/0,1,-1,-1,-1,2,-1,-1,3,4,5}; - static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5}; - QTest::newRow("Remove after remove") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 2, 3, C::CacheFlag) - << Range(a, 2, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) - << a << 3 << 2 - << (RemoveList() - << Remove(0, 0, 3, 6, 2, C::DefaultFlag | C::CacheFlag)) - << IndexArray(cacheIndexes) - << IndexArray(defaultIndexes) - << IndexArray() - << IndexArray(); - } { static const int cacheIndexes[] = {/*A*/-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1}; - static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6}; - QTest::newRow("Sparse remove") - << (RangeList() - << Range(a, 0, 2, C::CacheFlag) - << Range(a, 0, 1, C::DefaultFlag | C::CacheFlag) - << Range(a, 0, 1, C::CacheFlag) - << Range(a, 1, 5, C::DefaultFlag | C::CacheFlag) - << Range(a, 0, 1, C::CacheFlag) - << Range(a, 6, 2, C::DefaultFlag | C::CacheFlag) - << Range(a, 0, 1, C::CacheFlag) - << Range(a, 8, 3, C::DefaultFlag | C::CacheFlag) - << Range(a, 0, 1, C::CacheFlag) - << Range(a, 11, 1, C::DefaultFlag | C::CacheFlag) - << Range(a, 12, 5, C::DefaultFlag)) - << a << 1 << 10 - << (RemoveList() - << Remove(0, 0, 1, 4, 5, C::DefaultFlag | C::CacheFlag) - << Remove(0, 0, 1,10, 2, C::DefaultFlag | C::CacheFlag) - << Remove(0, 0, 1,13, 3, C::DefaultFlag | C::CacheFlag)) - << IndexArray(cacheIndexes) - << IndexArray(defaultIndexes) - << IndexArray() - << IndexArray(); - } -} - -void tst_qquicklistcompositor::listItemsRemoved() -{ - QFETCH(RangeList, ranges); - QFETCH(void *, list); - QFETCH(int, index); - QFETCH(int, count); - QFETCH(RemoveList, expectedRemoves); - QFETCH(IndexArray, cacheIndexes); - QFETCH(IndexArray, defaultIndexes); - QFETCH(IndexArray, visibleIndexes); - QFETCH(IndexArray, selectionIndexes); - - QQuickListCompositor compositor; - compositor.setGroupCount(4); - compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); - - foreach (const Range &range, ranges) - compositor.append(range.list, range.index, range.count, range.flags); - - QVector removes; - compositor.listItemsRemoved(list, index, count, &removes); - - QCOMPARE(removes, expectedRemoves); - - QCOMPARE(compositor.count(C::Cache), cacheIndexes.count); - for (int i = 0; i < cacheIndexes.count; ++i) { - if (cacheIndexes[i] != -1) { - QCOMPARE(compositor.find(C::Cache, i).modelIndex(), cacheIndexes[i]); - } - } - QCOMPARE(compositor.count(C::Default), defaultIndexes.count); - for (int i = 0; i < defaultIndexes.count; ++i) { - if (defaultIndexes[i] != -1) { - QCOMPARE(compositor.find(C::Default, i).modelIndex(), defaultIndexes[i]); - } - } - QCOMPARE(compositor.count(Visible), visibleIndexes.count); - for (int i = 0; i < visibleIndexes.count; ++i) { - if (visibleIndexes[i] != -1) { - QCOMPARE(compositor.find(Visible, i).modelIndex(), visibleIndexes[i]); - } - } - QCOMPARE(compositor.count(Selection), selectionIndexes.count); - for (int i = 0; i < selectionIndexes.count; ++i) { - if (selectionIndexes[i] != -1) { - QCOMPARE(compositor.find(Selection, i).modelIndex(), selectionIndexes[i]); - } - } -} - -void tst_qquicklistcompositor::listItemsMoved_data() -{ - QTest::addColumn("ranges"); - QTest::addColumn("list"); - QTest::addColumn("from"); - QTest::addColumn("to"); - QTest::addColumn("count"); - QTest::addColumn("expectedRemoves"); - QTest::addColumn("expectedInserts"); - QTest::addColumn("cacheIndexes"); - QTest::addColumn("defaultIndexes"); - QTest::addColumn("visibleIndexes"); - QTest::addColumn("selectionIndexes"); - - int listA; void *a = &listA; - int listB; void *b = &listB; - - { static const int defaultIndexes[] = {/*A*/0,2,3,4,/*B*/0,1,2,3,/*A*/5,6,1}; - QTest::newRow("4, 1, 3") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) - << Range(a, 2, 3, C::PrependFlag) - << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(b, 0, 4, C::DefaultFlag) - << Range(a, 2, 3, C::DefaultFlag)) - << a << 4 << 1 << 3 - << (RemoveList() - << Remove(0, 0, 2, 0, 2, C::DefaultFlag, 0)) - << (InsertList() - << Insert(0, 0, 1, 0, 2, C::DefaultFlag, 0)) - << IndexArray() - << IndexArray(defaultIndexes) - << IndexArray() - << IndexArray(); - } { static const int defaultIndexes[] = {/*A*/1,2,3,6,/*B*/0,1,2,3,/*A*/4,5,0}; - QTest::newRow("0, 6, 1") - << (RangeList() - << Range(a, 0, 1, C::PrependFlag | C::DefaultFlag) - << Range(a, 1, 1, C::PrependFlag) - << Range(a, 2, 3, C::PrependFlag | C::DefaultFlag) - << Range(a, 5, 2, C::PrependFlag) - << Range(a, 7, 0, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(b, 0, 4, C::DefaultFlag) - << Range(a, 5, 2, C::DefaultFlag) - << Range(a, 1, 1, C::DefaultFlag)) - << a << 0 << 6 << 1 - << (RemoveList() - << Remove(0, 0, 0, 0, 1, C::DefaultFlag, 0)) - << (InsertList() - << Insert(0, 0, 3, 0, 1, C::DefaultFlag, 0)) - << IndexArray() - << IndexArray(defaultIndexes) - << IndexArray() - << IndexArray(); - } { static const int cacheIndexes[] = {/*A*/0,1,3,4}; - static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6,7}; - QTest::newRow("6, 2, 1") - << (RangeList() - << Range(a, 0, 4, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 4, 4, C::AppendFlag | C::PrependFlag | C::DefaultFlag)) - << a << 6 << 2 << 1 - << (RemoveList() - << Remove(0, 0, 6, 4, 1, C::DefaultFlag, 0)) - << (InsertList() - << Insert(0, 0, 2, 2, 1, C::DefaultFlag, 0)) - << IndexArray(cacheIndexes) - << IndexArray(defaultIndexes) - << IndexArray() - << IndexArray(); - } { static const int cacheIndexes[] = {/*A*/0,1,-1,-1,-1,2,3,4,5,6,7}; - static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6,7}; - QTest::newRow("Move after remove") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 2, 3, C::CacheFlag) - << Range(a, 2, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) - << a << 4 << 2 << 2 - << (RemoveList() - << Remove(0, 0, 4, 7, 2, C::DefaultFlag | C::CacheFlag, 0)) - << (InsertList() - << Insert(0, 0, 2, 5, 2, C::DefaultFlag | C::CacheFlag, 0)) - << IndexArray(cacheIndexes) - << IndexArray(defaultIndexes) - << IndexArray() - << IndexArray(); - } { static const int cacheIndexes[] = {/*A*/0,1,5,6,7,8,9,10,11,12}; - static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6,7,8,9,10,11,12}; - QTest::newRow("Move merge tail") - << (RangeList() - << Range(a, 0, 10, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 10, 3, C::PrependFlag | C::DefaultFlag) - << Range(a, 13, 0, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) - << a << 8 << 0 << 5 - << (RemoveList() - << Remove(0, 0, 8, 8, 2, C::DefaultFlag | C::CacheFlag, 0) - << Remove(0, 0, 8, 8, 3, C::DefaultFlag, 1)) - << (InsertList() - << Insert(0, 0, 0, 0, 2, C::DefaultFlag | C::CacheFlag, 0) - << Insert(0, 0, 2, 2, 3, C::DefaultFlag, 1)) - << IndexArray(cacheIndexes) - << IndexArray(defaultIndexes) - << IndexArray() - << IndexArray(); - } { static const int cacheIndexes[] = {/*A*/0,1,2,3}; - static const int defaultIndexes[] = {/*A*/0,1,2,3}; - static const int selectionIndexes[] = {/*A*/3}; - QTest::newRow("Move selection") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 2, 1, C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 3, 1, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) - << a << 2 << 3 << 1 - << (RemoveList() - << Remove(0, 0, 2, 2, 1, C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag, 0)) - << (InsertList() - << Insert(0, 0, 3, 3, 1, C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag, 0)) - << IndexArray(cacheIndexes) - << IndexArray(defaultIndexes) - << IndexArray() - << IndexArray(selectionIndexes); - } { static const int cacheIndexes[] = {/*A*/0,1,2,3,4,5,8,9}; - static const int defaultIndexes[] = {/*A*/0,1,2,3,4,5,6,7,8,9,10,11}; - QTest::newRow("move mixed cached items") - << (RangeList() - << Range(a, 0, 1, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 1, 2, C::PrependFlag | C::DefaultFlag) - << Range(a, 3, 7, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 10, 2, C::PrependFlag | C::DefaultFlag)) - << a << 1 << 6 << 3 - << (RemoveList() - << Remove(0, 0, 1, 1, 2, C::PrependFlag | C::DefaultFlag, 0) - << Remove(0, 0, 1, 1, 1, C::PrependFlag | C::DefaultFlag | C::CacheFlag, 1)) - << (InsertList() - << Insert(0, 0, 6, 6, 2, C::PrependFlag | C::DefaultFlag, 0) - << Insert(0, 0, 8, 6, 1, C::PrependFlag | C::DefaultFlag | C::CacheFlag, 1)) - << IndexArray(cacheIndexes) - << IndexArray(defaultIndexes) - << IndexArray() - << IndexArray(); - } -} - -void tst_qquicklistcompositor::listItemsMoved() -{ - QFETCH(RangeList, ranges); - QFETCH(void *, list); - QFETCH(int, from); - QFETCH(int, to); - QFETCH(int, count); - QFETCH(RemoveList, expectedRemoves); - QFETCH(InsertList, expectedInserts); - QFETCH(IndexArray, cacheIndexes); - QFETCH(IndexArray, defaultIndexes); - QFETCH(IndexArray, visibleIndexes); - QFETCH(IndexArray, selectionIndexes); - - QQuickListCompositor compositor; - compositor.setGroupCount(4); - compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); - - foreach (const Range &range, ranges) - compositor.append(range.list, range.index, range.count, range.flags); - - QVector removes; - QVector inserts; - compositor.listItemsMoved(list, from, to, count, &removes, &inserts); - - QCOMPARE(removes, expectedRemoves); - QCOMPARE(inserts, expectedInserts); - - QCOMPARE(compositor.count(C::Cache), cacheIndexes.count); - for (int i = 0; i < cacheIndexes.count; ++i) { - if (cacheIndexes[i] != -1) { - QCOMPARE(compositor.find(C::Cache, i).modelIndex(), cacheIndexes[i]); - } - } - QCOMPARE(compositor.count(C::Default), defaultIndexes.count); - for (int i = 0; i < defaultIndexes.count; ++i) { - if (defaultIndexes[i] != -1) { - QCOMPARE(compositor.find(C::Default, i).modelIndex(), defaultIndexes[i]); - } - } - QCOMPARE(compositor.count(Visible), visibleIndexes.count); - for (int i = 0; i < visibleIndexes.count; ++i) { - if (visibleIndexes[i] != -1) { - QCOMPARE(compositor.find(Visible, i).modelIndex(), visibleIndexes[i]); - } - } - QCOMPARE(compositor.count(Selection), selectionIndexes.count); - for (int i = 0; i < selectionIndexes.count; ++i) { - if (selectionIndexes[i] != -1) { - QCOMPARE(compositor.find(Selection, i).modelIndex(), selectionIndexes[i]); - } - } -} - -void tst_qquicklistcompositor::listItemsChanged_data() -{ - QTest::addColumn("ranges"); - QTest::addColumn("list"); - QTest::addColumn("index"); - QTest::addColumn("count"); - QTest::addColumn("expectedChanges"); - - int listA; void *a = &listA; - int listB; void *b = &listB; - - QTest::newRow("overlapping") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag) - << Range(a, 2, 3, C::PrependFlag) - << Range(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag) - << Range(b, 0, 4, C::DefaultFlag) - << Range(a, 2, 3, C::DefaultFlag)) - << a << 3 << 4 - << (ChangeList() - << Change(0, 0, 2, 0, 2, C::DefaultFlag) - << Change(0, 0, 9, 0, 2, C::DefaultFlag)); - QTest::newRow("Change after remove") - << (RangeList() - << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) - << Range(a, 2, 3, C::CacheFlag) - << Range(a, 2, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) - << a << 3 << 2 - << (ChangeList() - << Change(0, 0, 3, 6, 2, C::DefaultFlag | C::CacheFlag)); -} - -void tst_qquicklistcompositor::listItemsChanged() -{ - QFETCH(RangeList, ranges); - QFETCH(void *, list); - QFETCH(int, index); - QFETCH(int, count); - QFETCH(ChangeList, expectedChanges); - - QQuickListCompositor compositor; - compositor.setGroupCount(4); - compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); - - foreach (const Range &range, ranges) - compositor.append(range.list, range.index, range.count, range.flags); - - QVector changes; - compositor.listItemsChanged(list, index, count, &changes); - - QCOMPARE(changes, expectedChanges); -} - -void tst_qquicklistcompositor::compositorDebug() -{ - void *a = (void *)0xa0; - void *b = (void *)0xb0; - - QQuickListCompositor compositor; - compositor.setGroupCount(4); - compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); - compositor.append(a, 0, 2, C::PrependFlag | C::DefaultFlag); - compositor.append(a, 2, 3, C::PrependFlag); - compositor.append(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag); - compositor.append(b, 0, 4, C::DefaultFlag); - compositor.append(a, 2, 3, C::DefaultFlag); - - QTest::ignoreMessage(QtDebugMsg, - "QQuickListCompositor(00110\n" - " 0 0 0 0 Range(0xa0 0 2 00P000000000D0\n" - " 0 0 2 0 Range(0xa0 2 3 00P00000000000\n" - " 0 0 2 0 Range(0xa0 5 2 0AP000000000D0\n" - " 0 0 4 0 Range(0xb0 0 4 000000000000D0\n" - " 0 0 8 0 Range(0xa0 2 3 000000000000D0)"); - qDebug() << compositor; - - compositor.setFlags(C::Default, 5, 2, SelectionFlag); - - QTest::ignoreMessage(QtDebugMsg, - "QQuickListCompositor(20110\n" - " 0 0 0 0 Range(0xa0 0 2 00P000000000D0\n" - " 0 0 2 0 Range(0xa0 2 3 00P00000000000\n" - " 0 0 2 0 Range(0xa0 5 2 0AP000000000D0\n" - " 0 0 4 0 Range(0xb0 0 1 000000000000D0\n" - " 0 0 5 0 Range(0xb0 1 2 000000000010D0\n" - " 2 0 7 0 Range(0xb0 3 1 000000000000D0\n" - " 2 0 8 0 Range(0xa0 2 3 000000000000D0)"); - qDebug() << compositor; -} - -void tst_qquicklistcompositor::changeDebug() -{ - void *a = (void *)0xa0; - void *b = (void *)0xb0; - - QQuickListCompositor compositor; - compositor.setGroupCount(4); - compositor.setDefaultGroups(VisibleFlag | C::DefaultFlag); - compositor.append(a, 0, 2, C::PrependFlag | C::DefaultFlag); - compositor.append(a, 2, 3, C::PrependFlag); - compositor.append(a, 5, 2, C::AppendFlag | C::PrependFlag | C::DefaultFlag); - compositor.append(b, 0, 1, C::DefaultFlag); - compositor.append(b, 1, 2, SelectionFlag | C::DefaultFlag); - compositor.append(b, 3, 1, C::DefaultFlag); - compositor.append(a, 2, 3, C::DefaultFlag); - - - QTest::ignoreMessage(QtDebugMsg, "Change(-1 2 000000010D0 2 0 7 0)"); - qDebug() << QQuickListCompositor::Change(compositor.find(C::Default, 7), 2, SelectionFlag | C::DefaultFlag); - QTest::ignoreMessage(QtDebugMsg, "Remove(9 4 000000000D0 10 0)"); - qDebug() << QQuickListCompositor::Remove(compositor.find(C::Default, 10), 4, C::DefaultFlag, 9); - QTest::ignoreMessage(QtDebugMsg, "Insert(9 4 000000000D0 3 0)"); - qDebug() << QQuickListCompositor::Insert(compositor.find(C::Default, 3), 4, C::DefaultFlag, 9); -} - -void tst_qquicklistcompositor::groupDebug() -{ - QTest::ignoreMessage(QtDebugMsg, "Default "); - qDebug() << C::Default; - QTest::ignoreMessage(QtDebugMsg, "Cache "); - qDebug() << C::Cache; - QTest::ignoreMessage(QtDebugMsg, "Group3 "); - qDebug() << Selection; -} - -QTEST_MAIN(tst_qquicklistcompositor) - -#include "tst_qquicklistcompositor.moc" - - -- cgit v1.2.3