import QtQuick 2.0

Item {
    id: root
    objectName: "root"
    property int zero: 0

    Item {
        id: c1
        objectName: "c1"
        property int one: zero + 1

        Item {
            id: c1c1
            objectName: "c1c1"
            property bool two: c2c1c1.two
        }

        Item {
            id: c1c2
            objectName: "c1c2"
            property string three: "three"

            Rectangle {
                id: c1c2c3
                objectName: "c1c2c3"
                property alias othercolor: c2c1.color
                color: if (c2c1.color == Qt.rgba(0,0,1)) Qt.rgba(1,0,0); else Qt.rgba(0,1,0);
            }
        }
    }

    Item {
        id: c2
        objectName: "c2"
        property string two: "two"

        Rectangle {
            id: c2c1
            objectName: "c2c1"
            property string three: "2" + c1c2.three
            color: "blue"

            MouseArea {
                id: c2c1c1
                objectName: "c2c1c1"
                property bool two: false
                onClicked: two = !two
            }

            Item {
                id: c2c1c2
                objectName: "c2c1c2"
                property string three: "1" + parent.three
            }
        }
    }

    Item {
        id: c3
        objectName: "c3"
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
        Item {}
    }

    property alias c1one: c1.one
    property bool success: true
    Component.onCompleted: {
        // test state after initial bindings evaluation
        if (zero != 0) success = false;
        if (c1.one != 1) success = false;
        if (c1c1.two != false) success = false;
        if (c1c2.three != "three") success = false;
        if (c1c2c3.color != Qt.rgba(1,0,0)) success = false;
        if (c2.two != "two") success = false;
        if (c2c1.three != "2three") success = false;
        if (c2c1.color != Qt.rgba(0,0,1)) success = false;
        if (c2c1c1.two != false) success = false;
        if (c2c1c2.three != "12three") success = false;
        if (c3.children.length != 500) success = false;

        // now retrigger bindings evaluation
        root.zero = 5;
        if (c1.one != 6) success = false;
        c2c1c1.two = true;
        if (c1c1.two != true) success = false;
        c1c2.three = "3";
        if (c2c1.three != "23") success = false;
        if (c2c1c2.three != "123") success = false;
        c2c1.color = Qt.rgba(1,0,0);
        if (c1c2c3.color != Qt.rgba(0,1,0)) success = false;
        if (c1c2c3.othercolor != Qt.rgba(1,0,0)) success = false;
    }
}
