/****************************************************************************
**
** 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: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 QtQuick 2.2
import QtTest 1.0
import QtQuickControlsTests 1.0

Item {
    id: container
    width: 400
    height: 400

TestCase {
    id: testCase
    name: "Tests_ComboBox"
    when:windowShown
    width:400
    height:400

    property var model

    function init() {
        model = Qt.createQmlObject("import QtQuick 2.2; ListModel {}", testCase, '')
        model.append({ text: "Banana", color: "Yellow" })
        model.append({ text: "Apple", color: "Green" })
        model.append({ text: "Coconut", color: "Brown" })
    }

    function cleanup() {
        if (model !== 0)
            model.destroy()
        wait(0) // spin the event loop to get all popups to close
    }

    function test_keyupdown() {
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox { model: 4 }', testCase, '');

        compare(comboBox.currentIndex, 0)

        comboBox.forceActiveFocus()

        keyPress(Qt.Key_Down)
        compare(comboBox.currentIndex, 1)
        keyPress(Qt.Key_Down)
        compare(comboBox.currentIndex, 2)
        keyPress(Qt.Key_Up)
        compare(comboBox.currentIndex, 1)
        comboBox.destroy()
    }

    function test_textrole() {
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox {}', testCase, '');
        comboBox.textRole = "text"
        comboBox.model = model
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "Banana")
        comboBox.textRole = "color"
        compare(comboBox.currentText, "Yellow")
        comboBox.destroy()
    }

    function test_arraymodel() {
        var arrayModel = [
            'Banana',
            'Apple',
            'Coconut'
        ];

        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox {}', testCase, '');
        comboBox.model = arrayModel
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "Banana")
        comboBox.destroy()
    }

    function test_arraymodelwithtextrole() {
        var arrayModel = [
            {text: 'Banana', color: 'Yellow'},
            {text: 'Apple', color: 'Green'},
            {text: 'Coconut', color: 'Brown'}
        ];

        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox { }', testCase, '');
        comboBox.textRole = "text"
        comboBox.model = arrayModel
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "Banana")
        comboBox.textRole = "color"
        compare(comboBox.currentText, "Yellow")
        comboBox.destroy()
    }

    function test_arrayModelWithoutTextRole() {
        var arrayModel = ['Banana', 'Coconut', 'Apple']

        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox {}', testCase, '');
        comboBox.model = arrayModel
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "Banana")
        comboBox.destroy()

        comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox {}', testCase, '');
        comboBox.editable = true
        comboBox.model = arrayModel
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "Banana")
        comboBox.destroy()
    }

    function test_validator() {
        var comboBox = Qt.createQmlObject('import QtQuick 2.2;              \
                                            import QtQuick.Controls 1.2;     \
                                            ComboBox {                       \
                                                editable: true;              \
                                                validator: RegExpValidator { \
                                                                regExp: /(red|blue|green)?/ \
                                            }}', testCase, '')

        comboBox.editText = "blu"
        compare(comboBox.acceptableInput, false)
        comboBox.editText = "blue"
        compare(comboBox.acceptableInput, true)
        comboBox.editText = "bluee"
        compare(comboBox.acceptableInput, false)
        comboBox.editText = ""
        compare(comboBox.acceptableInput, true)
        comboBox.editText = ""
        comboBox.forceActiveFocus()
        keyPress(Qt.Key_A)
        compare(comboBox.editText, "")
        keyPress(Qt.Key_A)
        compare(comboBox.editText, "")
        keyPress(Qt.Key_R)
        compare(comboBox.editText, "r")
        keyPress(Qt.Key_A)
        compare(comboBox.editText, "r")
        compare(comboBox.acceptableInput, false)
        keyPress(Qt.Key_E)
        compare(comboBox.editText, "re")
        compare(comboBox.acceptableInput, false)
        keyPress(Qt.Key_D)
        compare(comboBox.editText, "red")
        compare(comboBox.acceptableInput, true)
        comboBox.destroy()
    }

    function test_append_find() {
        var comboBox = Qt.createQmlObject( 'import QtQuick.Controls 1.2;                    \
                                        import QtQuick 2.2;                             \
                                        ComboBox {                                      \
                                            model:ListModel{ListElement{text:"first"}}  \
                                            onAccepted: {                               \
                                            if (find(currentText) === -1) {             \
                                                model.append({text: editText});         \
                                                currentIndex = find(editText);          \
                                            }                                           \
                                        }                                               \
                                       }', testCase, '')

        comboBox.editable = true
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "first")
        comboBox.forceActiveFocus();

        comboBox.selectAll();
        keyPress(Qt.Key_T)
        keyPress(Qt.Key_H)
        keyPress(Qt.Key_I)
        keyPress(Qt.Key_R)
        keyPress(Qt.Key_D)
        compare(comboBox.count, 1)
        compare(comboBox.currentText, "first")
        compare(comboBox.editText, "third")

        keyPress(Qt.Key_Enter)
        compare(comboBox.count, 2)
        compare(comboBox.currentIndex, 1)
        compare(comboBox.currentText, "third")
        comboBox.destroy()
    }

    function test_editable() {
        var arrayModel = ['Banana', 'Coco', 'Coconut', 'Apple', 'Cocomuffin' ]
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2;         \
                                            ComboBox {                          \
                                                property int acceptedCount: 0;  \
                                                onAccepted: ++acceptedCount;    \
                                           }'
                                          , testCase, '');
        comboBox.model = arrayModel
        comboBox.editable = true
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "Banana")
        compare(comboBox.acceptedCount, 0)
        comboBox.forceActiveFocus()
        comboBox.editText = ""

        keyPress(Qt.Key_C)
        compare(comboBox.currentText, "Banana")
        compare(comboBox.editText, "coco")
        compare(comboBox.currentIndex, 0)

        keyPress(Qt.Key_Right)
        keyPress(Qt.Key_N)
        compare(comboBox.currentText, "Banana")
        compare(comboBox.editText, "coconut")
        keyPress(Qt.Key_Enter) // Accept

        compare(comboBox.currentText, "Coconut")
        compare(comboBox.currentIndex, 2)

        keyPress(Qt.Key_Backspace)
        keyPress(Qt.Key_Backspace)
        keyPress(Qt.Key_Backspace)
        keyPress(Qt.Key_M)
        compare(comboBox.currentText, "Coconut")
        compare(comboBox.editText, "Cocomuffin")
        keyPress(Qt.Key_Enter) // Accept

        compare(comboBox.currentText, "Cocomuffin")
        compare(comboBox.currentIndex, 4)
        keyPress(Qt.Key_Return) // Accept
        compare(comboBox.acceptedCount, 3)

        comboBox.editText = ""
        compare(comboBox.editText, "")

        keyPress(Qt.Key_A)
        compare(comboBox.currentText, "Cocomuffin")
        keyPress(Qt.Key_Return) // Accept

        compare(comboBox.currentText, "Apple")
        compare(comboBox.editText, "Apple")
        compare(comboBox.currentIndex, 3)

        comboBox.editText = ""
        keyPress(Qt.Key_A)
        keyPress(Qt.Key_B)
        compare(comboBox.currentText, "Apple")
        compare(comboBox.editText, "ab")
        compare(comboBox.currentIndex, 3)

        keyPress(Qt.Key_Return) // Accept
        compare(comboBox.currentText, "ab")
        compare(comboBox.currentIndex, -1)

        // Test up down
        comboBox.editText = ""

        keyPress(Qt.Key_C)
        compare(comboBox.currentText, "ab")
        keyPress(Qt.Key_Return) // Accept
        compare(comboBox.currentText, "Coco")
        compare(comboBox.editText, "Coco")
        compare(comboBox.currentIndex, 1)

        keyPress(Qt.Key_Down)
        compare(comboBox.currentText, "Coconut")
        compare(comboBox.editText, "Coconut")
        compare(comboBox.currentIndex, 2)

        keyPress(Qt.Key_Up)
        compare(comboBox.currentText, "Coco")
        compare(comboBox.editText, "Coco")
        compare(comboBox.currentIndex, 1)

        comboBox.editText = ""
        keyPress(Qt.Key_C)
        keyPress(Qt.Key_O)
        keyPress(Qt.Key_C) // autocompletes "coco"
        keyPress(Qt.Key_Backspace)
        keyPress(Qt.Key_Return) // Accept "coc"
        compare(comboBox.editText, "coc")
        compare(comboBox.currentText, "coc")

        comboBox.editText = ""
        keyPress(Qt.Key_C)
        keyPress(Qt.Key_O)
        keyPress(Qt.Key_C) // autocompletes "coc"
        keyPress(Qt.Key_Space)
        keyPress(Qt.Key_Return) // Accept "coc "
        compare(comboBox.editText, "coc ")
        compare(comboBox.currentText, "coc ")

        comboBox.destroy()
    }

    function test_keySearch() {
        var arrayModel = ['Banana', 'Coco', 'Coconut', 'Apple', 'Cocomuffin' ]
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox {}', testCase, '');
        comboBox.model = arrayModel
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "Banana")
        comboBox.forceActiveFocus()

        keyPress(Qt.Key_C)
        compare(comboBox.editText, "Coco")
        compare(comboBox.currentText, "Coco")
        compare(comboBox.currentIndex, 1)

        keyPress(Qt.Key_N)
        compare(comboBox.editText, "Coco")
        compare(comboBox.currentText, "Coco")
        compare(comboBox.currentIndex, 1)

        keyPress(Qt.Key_A)
        compare(comboBox.editText, "Apple")
        compare(comboBox.currentText, "Apple")
        compare(comboBox.currentIndex, 3)

        keyPress(Qt.Key_B)
        compare(comboBox.editText, "Banana")
        compare(comboBox.currentText, "Banana")
        compare(comboBox.currentIndex, 0)

        comboBox.destroy()
    }

    function test_textAt() {
        var arrayModel = ['Banana', 'Coco', 'Coconut', 'Apple', 'Cocomuffin' ]
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox {}', testCase, '');
        comboBox.model = arrayModel
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "Banana")
        compare(comboBox.textAt(5), null)
        compare(comboBox.textAt(-1), null)
        compare(comboBox.textAt(0), "Banana")
        compare(comboBox.textAt(1), "Coco")
        compare(comboBox.textAt(2), "Coconut")
        compare(comboBox.textAt(3), "Apple")
        compare(comboBox.textAt(4), "Cocomuffin")
        comboBox.destroy()
    }

    function test_find() {
        var arrayModel = ['Banana', 'banana', 'Coconut', 'Apple', 'Cocomuffin' ]
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox {}', testCase, '');
        comboBox.model = arrayModel
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "Banana")
        compare(comboBox.find("Banana"), 0)
        compare(comboBox.find("banana"), 1)
        compare(comboBox.find("bananas"), -1)
        compare(comboBox.find("Apple"), 3)
        compare(comboBox.find("Cocomuffin"), 4)
        comboBox.destroy()
    }

    function test_activated() {
        var arrayModel = ['Banana', 'Coco', 'Coconut', 'Apple', 'Cocomuffin' ]
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2;         \
                                            ComboBox {                          \
                                                property int activatedCount: 0;  \
                                                onActivated: ++activatedCount;    \
                                           }'
                                          , testCase, '');
        comboBox.model = arrayModel
        compare(comboBox.currentIndex, 0)
        comboBox.forceActiveFocus()

        keyPress(Qt.Key_Down)
        compare(comboBox.activatedCount, 1)
        keyPress(Qt.Key_Down)
        compare(comboBox.activatedCount, 2)
        keyPress(Qt.Key_Up)
        compare(comboBox.activatedCount, 3)
        keyPress(Qt.Key_B)
        compare(comboBox.activatedCount, 4)
        keyPress(Qt.Key_B)
        compare(comboBox.activatedCount, 4)
        comboBox.destroy()
    }

    function test_activated_index_QTBUG_43050(){
        if (Qt.platform.os === "osx")
            skip("When the menu pops up on OS X, it does not return and the test fails after time out")
        if (Qt.platform.os === "windows")
            skip("Test randomly fails under Windows")

        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2; \
        ComboBox { \
            property bool indexWasUpdated: false; \
            model: 4; \
            onActivated: indexWasUpdated = (index === currentIndex); \
        }', container, '');
        var menuIndex = getMenuIndex(comboBox)
        verify(menuIndex !== -1)
        comboBox.forceActiveFocus()
        verify(!comboBox.data[menuIndex].__popupVisible)
        keyPress(Qt.Key_Space)
        verify(comboBox.data[menuIndex].__popupVisible)

        waitForRendering(comboBox)
        keyPress(Qt.Key_Down)
        keyPress(Qt.Key_Down)
        verify(!comboBox.indexWasUpdated)
        keyPress(Qt.Key_Enter)
        verify(comboBox.indexWasUpdated)

        comboBox.destroy()
    }

    function test_update_index_on_activated_QTBUG_51113(){
        if (Qt.platform.os === "osx")
            skip("When the menu pops up on OS X, it does not return and the test fails after time out")
        if (Qt.platform.os === "windows")
            skip("Test randomly fails under Windows")

        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2; \
        ComboBox { \
            model: 4; \
            onActivated: if (index == 1) currentIndex = 3; \
        }', container, '');
        var menuIndex = getMenuIndex(comboBox)
        verify(menuIndex !== -1)
        comboBox.forceActiveFocus()
        verify(!comboBox.data[menuIndex].__popupVisible)
        keyPress(Qt.Key_Space)
        verify(comboBox.data[menuIndex].__popupVisible)

        waitForRendering(comboBox)
        keyPress(Qt.Key_Down)
        keyPress(Qt.Key_Enter)
        compare(comboBox.currentIndex, 3)

        comboBox.destroy()
    }

    function test_activeFocusOnTab() {
        if (Qt.styleHints.tabFocusBehavior != Qt.TabFocusAllControls)
            skip("This function doesn't support NOT iterating all.")

        var test_control = 'import QtQuick 2.2; \
        import QtQuick.Controls 1.2;            \
        Item {                                  \
            width: 200;                         \
            height: 200;                        \
            property alias control1: _control1; \
            property alias control2: _control2; \
            property alias control3: _control3; \
            ComboBox  {                         \
                y: 20;                          \
                id: _control1;                  \
                activeFocusOnTab: true;         \
            }                                   \
            ComboBox  {                         \
                y: 70;                          \
                id: _control2;                  \
                activeFocusOnTab: false;        \
            }                                   \
            ComboBox  {                         \
                y: 120;                         \
                id: _control3;                  \
                activeFocusOnTab: true;         \
            }                                   \
        }                                       '

        var control = Qt.createQmlObject(test_control, container, '')
        control.control1.forceActiveFocus()
        verify(control.control1.activeFocus)
        verify(!control.control2.activeFocus)
        verify(!control.control3.activeFocus)
        keyPress(Qt.Key_Tab)
        verify(!control.control1.activeFocus)
        verify(!control.control2.activeFocus)
        verify(control.control3.activeFocus)
        keyPress(Qt.Key_Tab)
        verify(control.control1.activeFocus)
        verify(!control.control2.activeFocus)
        verify(!control.control3.activeFocus)
        keyPress(Qt.Key_Tab, Qt.ShiftModifier)
        verify(!control.control1.activeFocus)
        verify(!control.control2.activeFocus)
        verify(control.control3.activeFocus)
        keyPress(Qt.Key_Tab, Qt.ShiftModifier)
        verify(control.control1.activeFocus)
        verify(!control.control2.activeFocus)
        verify(!control.control3.activeFocus)

        control.control2.activeFocusOnTab = true
        control.control3.activeFocusOnTab = false
        keyPress(Qt.Key_Tab)
        verify(!control.control1.activeFocus)
        verify(control.control2.activeFocus)
        verify(!control.control3.activeFocus)
        keyPress(Qt.Key_Tab)
        verify(control.control1.activeFocus)
        verify(!control.control2.activeFocus)
        verify(!control.control3.activeFocus)
        keyPress(Qt.Key_Tab, Qt.ShiftModifier)
        verify(!control.control1.activeFocus)
        verify(control.control2.activeFocus)
        verify(!control.control3.activeFocus)
        keyPress(Qt.Key_Tab, Qt.ShiftModifier)
        verify(control.control1.activeFocus)
        verify(!control.control2.activeFocus)
        verify(!control.control3.activeFocus)
        control.destroy()
    }

    function test_activeFocusOnPress(){
        if (Qt.platform.os === "osx")
            skip("When the menu pops up on OS X, it does not return and the test fails after time out")

        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox { model: 4 }', container, '');
        comboBox.activeFocusOnPress = false
        verify(!comboBox.activeFocus)
        // two mouse clicks to open and close the popup menu
        mouseClick(comboBox, comboBox.x + 1, comboBox.y + 1)
        mouseClick(comboBox, comboBox.x + 1, comboBox.y + 1)
        verify(!comboBox.activeFocus)
        comboBox.activeFocusOnPress = true
        // two mouse clicks to open and close the popup menu. The 1ms delay between mouse presses is
        // needed with software quick renderer. Without the delay, this test is flaky.
        mouseClick(comboBox, comboBox.x + 1, comboBox.y + 1, Qt.LeftButton, Qt.NoModifier, 1)
        mouseClick(comboBox, comboBox.x + 1, comboBox.y + 1)
        verify(comboBox.activeFocus)
        comboBox.destroy()
    }

    function test_spaceKey(){
        if (Qt.platform.os === "osx")
            skip("When the menu pops up on OS X, it does not return and the test fails after time out")

        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox { model: 4 }', container, '');
        var menuIndex = getMenuIndex(comboBox)
        verify(menuIndex !== -1)
        comboBox.forceActiveFocus()
        verify(!comboBox.data[menuIndex].__popupVisible)
        keyPress(Qt.Key_Space)
        verify(comboBox.data[menuIndex].__popupVisible)

        // close the menu before destroying the combobox
        comboBox.data[menuIndex].__closeAndDestroy()
        verify(!comboBox.data[menuIndex].__popupVisible)

        comboBox.destroy()
    }

    function test_currentIndexInMenu() {
        if (Qt.platform.os === "osx")
            skip("When the menu pops up on OS X, it does not return and the test fails after time out")

        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox { model: 4 }', container, '');
        var menuIndex = getMenuIndex(comboBox)
        comboBox.currentIndex = 2
        verify(menuIndex !== -1)
        comboBox.forceActiveFocus()
        keyPress(Qt.Key_Space)
        verify(comboBox.data[menuIndex].__popupVisible)
        compare(comboBox.data[menuIndex].__currentIndex, comboBox.currentIndex)
        for (var i = 0; i < comboBox.data[menuIndex].items.length; i++)
        {
            if ( i !== comboBox.currentIndex)
                verify(!comboBox.data[menuIndex].items[i].checked)
            else
                verify(comboBox.data[menuIndex].items[i].checked)
        }
        // close the menu before destroying the combobox
        comboBox.data[menuIndex].__closeAndDestroy()
        verify(!comboBox.data[menuIndex].__popupVisible)
        comboBox.destroy()
    }

    SignalSpy {
        id: modelSpy
        signalName: "modelChanged"
    }

    SignalSpy {
        id: textSpy
        signalName: "currentTextChanged"
    }

    SignalSpy {
        id: indexSpy
        signalName: "currentIndexChanged"
    }

    function test_modelChange() {
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox { model: ["a", "b", "c", "d"] }', container, '');
        modelSpy.target = textSpy.target = indexSpy.target = comboBox

        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "a")

        // 1st model change
        comboBox.model = ["A", "B", "C", "D"]
        compare(comboBox.currentIndex, 0)
        compare(modelSpy.count, 1)
        compare(indexSpy.count, 0)
        compare(textSpy.count, 1)
        modelSpy.clear()
        indexSpy.clear()
        textSpy.clear()

        // Setting currentIndex
        comboBox.currentIndex = 3
        compare(indexSpy.count, 1)
        compare(textSpy.count, 1)
        indexSpy.clear()
        textSpy.clear()

        // 2nd model change
        comboBox.model = 4
        compare(comboBox.currentIndex, 0)
        compare(modelSpy.count, 1)
        compare(indexSpy.count, 1)
        compare(textSpy.count, 1)
        modelSpy.clear()
        indexSpy.clear()
        textSpy.clear()

        // 3rd model change
        comboBox.model = ["a", "b", "c", "d"]
        compare(comboBox.currentIndex, 0)
        compare(modelSpy.count, 1)
        compare(indexSpy.count, 0)
        compare(textSpy.count, 1)

        comboBox.destroy()
    }

    function test_addRemoveItemsInModel_QTBUG_30379() {
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox {}', testCase, '');
        comboBox.textRole = "text"
        comboBox.model = model
        var menuIndex = getMenuIndex(comboBox)
        verify(menuIndex !== -1)
        compare(comboBox.model.count, 3)
        compare(comboBox.data[menuIndex].items.length, 3)
        comboBox.model.append({ text: "Tomato", color: "Red" })
        compare(comboBox.model.count, 4)
        compare(comboBox.data[menuIndex].items.length, 4)
        comboBox.model.remove(2, 2)
        compare(comboBox.model.count, 2)
        compare(comboBox.data[menuIndex].items.length, 2)
        comboBox.destroy()
    }

    function test_width_QTBUG_30377() {
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox { model: ["A", "BB", "CCCCC"] }', testCase, '');
        compare(comboBox.currentIndex, 0)
        var initialWidth = comboBox.width
        comboBox.currentIndex = 1
        compare(comboBox.width, initialWidth)
        comboBox.currentIndex = 2
        compare(comboBox.width, initialWidth)
        comboBox.destroy()
    }

    function test_stringListModel() {
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox { }', testCase, '');
        comboBox.model = model_qstringlist;
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "A")
        comboBox.currentIndex = 1
        compare(comboBox.currentIndex, 1)
        compare(comboBox.currentText, "B")
        comboBox.currentIndex = 2
        compare(comboBox.currentIndex, 2)
        compare(comboBox.currentText, "C")
        comboBox.destroy()
    }

    function test_variantListModel() {
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox { }', testCase, '');
        comboBox.model = model_qvarlist;
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "3")
        comboBox.currentIndex = 1
        compare(comboBox.currentIndex, 1)
        compare(comboBox.currentText, "2")
        comboBox.currentIndex = 2
        compare(comboBox.currentIndex, 2)
        compare(comboBox.currentText, "1")
        comboBox.destroy()
    }

    function getMenuIndex(control) {
        var index = -1
        for (var i = 0; i < control.data.length; i++)
        {
            if (control.data[i].objectName === 'popup') {
                index = i
                break
            }
        }
        return index
    }

    function test_emptyTextItem() {
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox { }', testCase, '');
        comboBox.model = [
            "1",
            "",
            "3"
        ]
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "1")
        comboBox.currentIndex = 1
        compare(comboBox.currentIndex, 1)
        compare(comboBox.currentText, "")
        comboBox.currentIndex = 2
        compare(comboBox.currentIndex, 2)
        compare(comboBox.currentText, "3")
        compare(comboBox.find(""), 1)
        comboBox.destroy()
    }

    function test_minusOneIndexResetsSelection_QTBUG_35794() {
        var qmlObjects = ['import QtQuick.Controls 1.2 ; ComboBox { model: ["A", "B", "C"] }',
                          'import QtQuick.Controls 1.2 ; ComboBox { editable: true; model: ["A", "B", "C"] }']
        for (var i = 0; i < qmlObjects.length; i++) {
            var comboBox = Qt.createQmlObject(qmlObjects[i], testCase, '');
            compare(comboBox.currentIndex, 0)
            compare(comboBox.currentText, "A")
            comboBox.currentIndex = -1
            compare(comboBox.currentIndex, -1)
            compare(comboBox.currentText, "")
            comboBox.currentIndex = 1
            compare(comboBox.currentIndex, 1)
            compare(comboBox.currentText, "B")
            comboBox.destroy()
        }
    }

    function test_minusOneToZeroSelection_QTBUG_38036() {
        var qmlObject = 'import QtQuick.Controls 1.2 ; ComboBox { model: ["A", "B", "C"] }'
        var comboBox = Qt.createQmlObject(qmlObject, testCase, '');
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "A")
        comboBox.currentIndex = -1
        compare(comboBox.currentIndex, -1)
        compare(comboBox.currentText, "")
        comboBox.currentIndex = 0
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "A")
        comboBox.destroy()
    }

    function test_keys() {
        var component = Qt.createComponent("combobox/cb_keys.qml")
        compare(component.status, Component.Ready)
        var test =  component.createObject(container);
        verify(test !== null, "test control created is null")
        var control1 = test.control1
        verify(control1 !== null)

        control1.forceActiveFocus()
        verify(control1.activeFocus)

        verify(control1.gotit === false)
        verify(control1.editText === "0")

        keyPress(Qt.Key_A)
        verify(control1.activeFocus)
        verify(control1.gotit === false)
        verify(control1.editText === "0a")

        keyPress(Qt.Key_B)
        verify(control1.activeFocus)
        verify(control1.gotit === true)
        verify(control1.editText === "0a")

        keyPress(Qt.Key_B)
        verify(control1.activeFocus)
        verify(control1.gotit === true)
        verify(control1.editText === "0ab")

        test.destroy()
    }

    function test_modelDataChange() {
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox {}', testCase, '');
        comboBox.textRole = "text"
        comboBox.model = model
        compare(comboBox.currentIndex, 0)
        compare(comboBox.currentText, "Banana")
        model.set(0, { text: "Pomegranate", color: "Yellow" })
        compare(comboBox.currentText, "Pomegranate")
        comboBox.destroy()
    }

    function test_qtBug44532() {
        if (Qt.platform.os === "osx")
            skip("When the menu pops up on OS X, it does not return and the test fails after time out")
        var comboBox = Qt.createQmlObject('import QtQuick.Controls 1.2 ; ComboBox { model: ["A", "BB", "CCCCC"] }', container, '')
        var popup = comboBox.__popup
        verify(popup)
        tryCompare(popup, "__popupVisible", false)
        mouseClick(comboBox)
        tryCompare(popup, "__popupVisible", true)
        mouseClick(comboBox)
        tryCompare(popup, "__popupVisible", false)
        comboBox.destroy()
    }
}
}
