/****************************************************************************
**
** Copyright (C) 2017 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:BSD$
** 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.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of The Qt Company Ltd nor the names of its
**     contributors may be used to endorse or promote products derived
**     from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/

import QtQml 2.1
import QtQml.Models 2.3
import QtTest 1.1

TestCase {
    name: "ObjectModel"

    ObjectModel {
        id: model
        QtObject { id: static0 }
        QtObject { id: static1 }
        QtObject { id: static2 }
    }

    Component { id: object; QtObject { } }

    function test_attached_index() {
        compare(model.count, 3)
        compare(static0.ObjectModel.index, 0)
        compare(static1.ObjectModel.index, 1)
        compare(static2.ObjectModel.index, 2)

        var dynamic0 = object.createObject(model, {objectName: "dynamic0"})
        compare(dynamic0.ObjectModel.index, -1)
        model.append(dynamic0) // -> [static0, static1, static2, dynamic0]
        compare(model.count, 4)
        for (var i = 0; i < model.count; ++i)
            compare(model.get(i).ObjectModel.index, i)

        var dynamic1 = object.createObject(model, {objectName: "dynamic1"})
        compare(dynamic1.ObjectModel.index, -1)
        model.insert(0, dynamic1) // -> [dynamic1, static0, static1, static2, dynamic0]
        compare(model.count, 5)
        for (i = 0; i < model.count; ++i)
            compare(model.get(i).ObjectModel.index, i)

        model.move(1, 3) // -> [dynamic1, static1, static2, static0, dynamic0]
        compare(model.count, 5)
        for (i = 0; i < model.count; ++i)
            compare(model.get(i).ObjectModel.index, i)

        model.move(4, 0) // -> [dynamic0, dynamic1, static1, static2, static0]
        compare(model.count, 5)
        for (i = 0; i < model.count; ++i)
            compare(model.get(i).ObjectModel.index, i)

        model.remove(1) // -> [dynamic0, static1, static2, static0]
        compare(model.count, 4)
        compare(dynamic1.ObjectModel.index, -1)
        for (i = 0; i < model.count; ++i)
            compare(model.get(i).ObjectModel.index, i)

        model.clear()
        compare(static0.ObjectModel.index, -1)
        compare(static1.ObjectModel.index, -1)
        compare(static2.ObjectModel.index, -1)
        compare(dynamic0.ObjectModel.index, -1)
        compare(dynamic1.ObjectModel.index, -1)
    }
}
