/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <qtest.h>
#include <private/qqmllistcompositor_p.h>

template<typename T, int N> 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 <typename T>  struct Array
{
    Array() : array(nullptr) {}
    template<int N> Array(const T (&array)[N]) : array(array), count(N) {}

    T operator [](int index) const { return array[index]; }

    const T *array;
    int count = 0;
};

typedef Array<int> IndexArray;
typedef Array<const void *> ListArray;

typedef QVector<QQmlListCompositor::Remove> RemoveList;
typedef QVector<QQmlListCompositor::Insert> InsertList;
typedef QVector<QQmlListCompositor::Change> ChangeList;

typedef QVector<Range> 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<RangeList>("ranges");
    QTest::addColumn<C::Group>("startGroup");
    QTest::addColumn<int>("startIndex");
    QTest::addColumn<C::Group>("group");
    QTest::addColumn<int>("index");
    QTest::addColumn<int>("selectionIndex");
    QTest::addColumn<int>("visibleIndex");
    QTest::addColumn<int>("defaultIndex");
    QTest::addColumn<int>("cacheIndex");
    QTest::addColumn<uint>("rangeFlags");
    QTest::addColumn<int>("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(nullptr, 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<RangeList>("ranges");
    QTest::addColumn<C::Group>("group");
    QTest::addColumn<int>("index");
    QTest::addColumn<int>("selectionIndex");
    QTest::addColumn<int>("visibleIndex");
    QTest::addColumn<int>("defaultIndex");
    QTest::addColumn<int>("cacheIndex");
    QTest::addColumn<uint>("rangeFlags");
    QTest::addColumn<int>("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(nullptr, 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(nullptr, 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<int>(), 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<int>(), 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<int>(), 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<int>(), 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<int>(), 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<int>(), 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<int>(), lists[i]);
            if (lists[i]) QCOMPARE(it.modelIndex(), indexes[i]);
        }
    }
}

void tst_qqmllistcompositor::clearFlags_data()
{
    QTest::addColumn<RangeList>("ranges");
    QTest::addColumn<C::Group>("group");
    QTest::addColumn<int>("index");
    QTest::addColumn<int>("count");
    QTest::addColumn<int>("flags");
    QTest::addColumn<RemoveList>("expectedRemoves");
    QTest::addColumn<IndexArray>("cacheIndexes");
    QTest::addColumn<ListArray>("cacheLists");
    QTest::addColumn<IndexArray>("defaultIndexes");
    QTest::addColumn<ListArray>("defaultLists");
    QTest::addColumn<IndexArray>("visibleIndexes");
    QTest::addColumn<ListArray>("visibleLists");
    QTest::addColumn<IndexArray>("selectionIndexes");
    QTest::addColumn<ListArray>("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,nullptr,nullptr,nullptr,nullptr};
        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,nullptr,nullptr,nullptr,nullptr};
        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,nullptr,nullptr,nullptr,nullptr};
        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,nullptr,nullptr,nullptr,nullptr};
        QTest::newRow("Default, 2, 2, Selection")
                << (RangeList()
                    << Range(a, 0, 12, int(C::AppendFlag | C::PrependFlag |  SelectionFlag | VisibleFlag | C::DefaultFlag | C::CacheFlag))
                    << Range(nullptr, 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,nullptr,nullptr,nullptr,nullptr};
        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,nullptr,nullptr,nullptr,nullptr};
        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,nullptr,nullptr,nullptr,nullptr};
        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,nullptr,nullptr,nullptr,nullptr};
        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(nullptr, 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,nullptr,nullptr,nullptr,nullptr};
        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,nullptr,nullptr,nullptr};
        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,nullptr,nullptr,nullptr};
        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,nullptr,nullptr,nullptr};
        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(nullptr, 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,nullptr};
        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,nullptr,nullptr,nullptr};
        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,nullptr,nullptr,nullptr};
        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,nullptr,nullptr,nullptr};
        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(nullptr, 0, 1, int(C::CacheFlag))
                    << Range(nullptr, 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,nullptr};
        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,nullptr};
        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,nullptr};
        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,nullptr};
        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(nullptr, 0, 2, int(SelectionFlag | VisibleFlag | C::DefaultFlag))
                    << Range(nullptr, 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<C::Remove> 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<RangeList>("ranges");
    QTest::addColumn<C::Group>("group");
    QTest::addColumn<int>("index");
    QTest::addColumn<int>("count");
    QTest::addColumn<int>("flags");
    QTest::addColumn<InsertList>("expectedInserts");
    QTest::addColumn<IndexArray>("cacheIndexes");
    QTest::addColumn<ListArray>("cacheLists");
    QTest::addColumn<IndexArray>("defaultIndexes");
    QTest::addColumn<ListArray>("defaultLists");
    QTest::addColumn<IndexArray>("visibleIndexes");
    QTest::addColumn<ListArray>("visibleLists");
    QTest::addColumn<IndexArray>("selectionIndexes");
    QTest::addColumn<ListArray>("selectionLists");

    int listA; void *a = &listA;

    {   static const int cacheIndexes[] = {0,0,0,0};
        static const void *cacheLists[] = {nullptr,nullptr,nullptr,nullptr};
        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(nullptr, 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[] = {nullptr,nullptr,nullptr,nullptr};
        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(nullptr, 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,nullptr,nullptr,nullptr,nullptr};
        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(nullptr, 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,nullptr,nullptr,nullptr,nullptr};
        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,nullptr};
        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(nullptr, 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<C::Insert> 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<RangeList>("ranges");
    QTest::addColumn<C::Group>("fromGroup");
    QTest::addColumn<int>("from");
    QTest::addColumn<C::Group>("toGroup");
    QTest::addColumn<int>("to");
    QTest::addColumn<int>("count");
    QTest::addColumn<RemoveList>("expectedRemoves");
    QTest::addColumn<InsertList>("expectedInserts");
    QTest::addColumn<IndexArray>("cacheIndexes");
    QTest::addColumn<ListArray>("cacheLists");
    QTest::addColumn<IndexArray>("defaultIndexes");
    QTest::addColumn<ListArray>("defaultLists");
    QTest::addColumn<IndexArray>("visibleIndexes");
    QTest::addColumn<ListArray>("visibleLists");
    QTest::addColumn<IndexArray>("selectionIndexes");
    QTest::addColumn<ListArray>("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[] = {nullptr,nullptr,nullptr,nullptr,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[] = {nullptr,a,a,a,a,a,a,b,b,b,b,b,b,nullptr,nullptr,nullptr,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(nullptr, 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[] = {nullptr,nullptr,nullptr,nullptr,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[] = {nullptr,nullptr,a,a,a,a,a,a,b,b,b,b,b,b,nullptr,nullptr,c,c,c,c,c,c};
        QTest::newRow("15, 1, 1")
                << (RangeList()
                    << Range(nullptr, 0, 1, C::DefaultFlag | C::CacheFlag)
                    << Range(a, 0, 6, C::DefaultFlag)
                    << Range(b, 0, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag)
                    << Range(nullptr, 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[] = {nullptr,nullptr,nullptr,nullptr,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,nullptr,nullptr,a,a,a,b,b,b,b,b,b,nullptr,nullptr,c,c,c,c,c,c};
        QTest::newRow("0, 3, 2")
                << (RangeList()
                    << Range(nullptr, 0, 2, C::DefaultFlag | C::CacheFlag)
                    << Range(a, 0, 6, C::DefaultFlag)
                    << Range(b, 0, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag)
                    << Range(nullptr, 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[] = {nullptr,nullptr,nullptr,nullptr,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,nullptr,nullptr,c,a,a,nullptr,nullptr,a,a,c,c,c,c,c};
        QTest::newRow("7, 1, 10")
                << (RangeList()
                    << Range(a, 0, 3, C::DefaultFlag)
                    << Range(nullptr, 0, 2, C::DefaultFlag | C::CacheFlag)
                    << Range(a, 3, 3, C::DefaultFlag)
                    << Range(b, 0, 6, C::AppendFlag | C::PrependFlag | C::DefaultFlag)
                    << Range(nullptr, 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[] = {nullptr,nullptr,nullptr,nullptr,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,nullptr,nullptr,c,a,a,nullptr,nullptr,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(nullptr, 0, 2, C::DefaultFlag | C::CacheFlag)
                    << Range(c, 0, 1, C::DefaultFlag)
                    << Range(a, 1, 2, C::DefaultFlag)
                    << Range(nullptr, 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<C::Remove> removes;
    QVector<C::Insert> 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<C::Insert> 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(nullptr, 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<RangeList>("ranges");
    QTest::addColumn<void *>("list");
    QTest::addColumn<int>("index");
    QTest::addColumn<int>("count");
    QTest::addColumn<InsertList>("expectedInserts");
    QTest::addColumn<IndexArray>("cacheIndexes");
    QTest::addColumn<IndexArray>("defaultIndexes");
    QTest::addColumn<IndexArray>("visibleIndexes");
    QTest::addColumn<IndexArray>("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<C::Insert> 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<RangeList>("ranges");
    QTest::addColumn<void *>("list");
    QTest::addColumn<int>("index");
    QTest::addColumn<int>("count");
    QTest::addColumn<RemoveList>("expectedRemoves");
    QTest::addColumn<IndexArray>("cacheIndexes");
    QTest::addColumn<IndexArray>("defaultIndexes");
    QTest::addColumn<IndexArray>("visibleIndexes");
    QTest::addColumn<IndexArray>("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<C::Remove> 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<RangeList>("ranges");
    QTest::addColumn<void *>("list");
    QTest::addColumn<int>("from");
    QTest::addColumn<int>("to");
    QTest::addColumn<int>("count");
    QTest::addColumn<RemoveList>("expectedRemoves");
    QTest::addColumn<InsertList>("expectedInserts");
    QTest::addColumn<IndexArray>("cacheIndexes");
    QTest::addColumn<IndexArray>("defaultIndexes");
    QTest::addColumn<IndexArray>("visibleIndexes");
    QTest::addColumn<IndexArray>("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<C::Remove> removes;
    QVector<C::Insert> 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<RangeList>("ranges");
    QTest::addColumn<void *>("list");
    QTest::addColumn<int>("index");
    QTest::addColumn<int>("count");
    QTest::addColumn<ChangeList>("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<C::Change> 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"


