diff options
Diffstat (limited to 'tests/auto/quickcontrols2/controls/data/tst_combobox.qml')
-rw-r--r-- | tests/auto/quickcontrols2/controls/data/tst_combobox.qml | 2283 |
1 files changed, 0 insertions, 2283 deletions
diff --git a/tests/auto/quickcontrols2/controls/data/tst_combobox.qml b/tests/auto/quickcontrols2/controls/data/tst_combobox.qml deleted file mode 100644 index 5359f63c..00000000 --- a/tests/auto/quickcontrols2/controls/data/tst_combobox.qml +++ /dev/null @@ -1,2283 +0,0 @@ -/**************************************************************************** -** -** 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 QtQuick -import QtQuick.Window -import QtTest -import QtQuick.Controls - -TestCase { - id: testCase - width: 400 - height: 400 - visible: true - when: windowShown - name: "ComboBox" - - Component { - id: signalSpy - SignalSpy { } - } - - Component { - id: comboBox - ComboBox { } - } - - Component { - id: emptyBox - ComboBox { - delegate: ItemDelegate { - width: parent.width - } - } - } - - Component { - id: mouseArea - MouseArea { } - } - - Component { - id: customPopup - Popup { - width: 100 - implicitHeight: contentItem.implicitHeight - contentItem: TextInput { - anchors.fill: parent - } - } - } - - Component { - id: comboBoxWithShaderEffect - ComboBox { - delegate: Rectangle { - Text { - id: txt - anchors.centerIn: parent - text: "item" + index - font.pixelSize: 20 - color: "red" - } - id: rect - objectName: "rect" - width: parent.width - height: txt.implicitHeight - gradient: Gradient { - GradientStop { color: "lightsteelblue"; position: 0.0 } - GradientStop { color: "blue"; position: 1.0 } - } - layer.enabled: true - layer.effect: ShaderEffect { - objectName: "ShaderFX" - width: rect.width - height: rect.height - fragmentShader: " - uniform lowp sampler2D source; // this item - uniform lowp float qt_Opacity; // inherited opacity of this item - varying highp vec2 qt_TexCoord0; - void main() { - lowp vec4 p = texture2D(source, qt_TexCoord0); - lowp float g = dot(p.xyz, vec3(0.344, 0.5, 0.156)); - gl_FragColor = vec4(g, g, g, p.a) * qt_Opacity; - }" - - } - } - } - } - - function init() { - // QTBUG-61225: Move the mouse away to avoid QQuickWindowPrivate::flushFrameSynchronousEvents() - // delivering interfering hover events based on the last mouse position from earlier tests. For - // example, ComboBox::test_activation() kept receiving hover events for the last mouse position - // from CheckDelegate::test_checked(). - mouseMove(testCase, testCase.width - 1, testCase.height - 1) - } - - function test_defaults() { - var control = createTemporaryObject(comboBox, testCase) - verify(control) - - compare(control.count, 0) - compare(control.model, undefined) - compare(control.flat, false) - compare(control.pressed, false) - compare(control.currentIndex, -1) - compare(control.highlightedIndex, -1) - compare(control.currentText, "") - verify(control.delegate) - verify(control.indicator) - verify(control.popup) - verify(control.acceptableInput) - compare(control.inputMethodHints, Qt.ImhNoPredictiveText) - } - - function test_array() { - var control = createTemporaryObject(comboBox, testCase) - verify(control) - - var items = [ "Banana", "Apple", "Coconut" ] - - control.model = items - compare(control.model, items) - - compare(control.count, 3) - compare(control.currentIndex, 0) - compare(control.currentText, "Banana") - - control.currentIndex = 2 - compare(control.currentIndex, 2) - compare(control.currentText, "Coconut") - - control.model = null - compare(control.model, null) - compare(control.count, 0) - compare(control.currentIndex, -1) - compare(control.currentText, "") - } - - function test_objects() { - var control = createTemporaryObject(emptyBox, testCase) - verify(control) - - var items = [ - { text: "Apple" }, - { text: "Orange" }, - { text: "Banana" } - ] - - control.model = items - compare(control.model, items) - - compare(control.count, 3) - compare(control.currentIndex, 0) - compare(control.currentText, "Apple") - - control.currentIndex = 2 - compare(control.currentIndex, 2) - compare(control.currentText, "Banana") - - control.model = null - compare(control.model, null) - compare(control.count, 0) - compare(control.currentIndex, -1) - compare(control.currentText, "") - } - - function test_qobjects() { - var control = createTemporaryObject(emptyBox, testCase, {textRole: "text"}) - verify(control) - - var obj1 = Qt.createQmlObject("import QtQml; QtObject { property string text: 'one' }", control) - var obj2 = Qt.createQmlObject("import QtQml; QtObject { property string text: 'two' }", control) - var obj3 = Qt.createQmlObject("import QtQml; QtObject { property string text: 'three' }", control) - - control.model = [obj1, obj2, obj3] - - compare(control.count, 3) - compare(control.currentIndex, 0) - compare(control.currentText, "one") - - control.currentIndex = 2 - compare(control.currentIndex, 2) - compare(control.currentText, "three") - - control.model = null - compare(control.model, null) - compare(control.count, 0) - compare(control.currentIndex, -1) - compare(control.currentText, "") - } - - function test_number() { - var control = createTemporaryObject(comboBox, testCase) - verify(control) - - control.model = 10 - compare(control.model, 10) - - compare(control.count, 10) - compare(control.currentIndex, 0) - compare(control.currentText, "0") - - control.currentIndex = 9 - compare(control.currentIndex, 9) - compare(control.currentText, "9") - - control.model = 0 - compare(control.model, 0) - compare(control.count, 0) - compare(control.currentIndex, -1) - compare(control.currentText, "") - } - - ListModel { - id: listmodel - ListElement { text: "First" } - ListElement { text: "Second" } - ListElement { text: "Third" } - ListElement { text: "Fourth" } - ListElement { text: "Fifth" } - } - - function test_listModel() { - var control = createTemporaryObject(comboBox, testCase) - verify(control) - - control.model = listmodel - compare(control.model, listmodel) - - compare(control.count, 5) - compare(control.currentIndex, 0) - compare(control.currentText, "First") - - control.currentIndex = 2 - compare(control.currentIndex, 2) - compare(control.currentText, "Third") - - control.model = undefined - compare(control.model, undefined) - compare(control.count, 0) - compare(control.currentIndex, -1) - compare(control.currentText, "") - } - - ListModel { - id: fruitmodel - ListElement { name: "Apple"; color: "red" } - ListElement { name: "Orange"; color: "orange" } - ListElement { name: "Banana"; color: "yellow" } - } - - Component { - id: fruitModelComponent - ListModel { - ListElement { name: "Apple"; color: "red" } - ListElement { name: "Orange"; color: "orange" } - ListElement { name: "Banana"; color: "yellow" } - } - } - - property var fruitarray: [ - { name: "Apple", color: "red" }, - { name: "Orange", color: "orange" }, - { name: "Banana", color: "yellow" } - ] - - Component { - id: birdModelComponent - ListModel { - ListElement { name: "Galah"; color: "pink" } - ListElement { name: "Kookaburra"; color: "brown" } - ListElement { name: "Magpie"; color: "black" } - } - } - - function test_textRole_data() { - return [ - { tag: "ListModel", model: fruitmodel }, - { tag: "ObjectArray", model: fruitarray } - ] - } - - function test_textRole(data) { - var control = createTemporaryObject(emptyBox, testCase) - verify(control) - - control.model = data.model - compare(control.count, 3) - compare(control.currentIndex, 0) - compare(control.currentText, "") - - control.textRole = "name" - compare(control.currentText, "Apple") - - control.textRole = "color" - compare(control.currentText, "red") - - control.currentIndex = 1 - compare(control.currentIndex, 1) - compare(control.currentText, "orange") - - control.textRole = "name" - compare(control.currentText, "Orange") - - control.textRole = "" - compare(control.currentText, "") - } - - function test_textAt() { - var control = createTemporaryObject(comboBox, testCase) - verify(control) - - control.model = ["Apple", "Orange", "Banana"] - compare(control.textAt(0), "Apple") - compare(control.textAt(1), "Orange") - compare(control.textAt(2), "Banana") - compare(control.textAt(-1), "") // TODO: null? - compare(control.textAt(5), "") // TODO: null? - } - - function test_find_data() { - return [ - { tag: "Banana (MatchExactly)", term: "Banana", flags: Qt.MatchExactly, index: 0 }, - { tag: "banana (MatchExactly)", term: "banana", flags: Qt.MatchExactly, index: 1 }, - { tag: "bananas (MatchExactly)", term: "bananas", flags: Qt.MatchExactly, index: -1 }, - { tag: "Cocomuffin (MatchExactly)", term: "Cocomuffin", flags: Qt.MatchExactly, index: 4 }, - - { tag: "b(an)+a (MatchRegularExpression)", term: "B(an)+a", flags: Qt.MatchRegularExpression, index: 0 }, - { tag: "b(an)+a (MatchRegularExpression|MatchCaseSensitive)", term: "b(an)+a", flags: Qt.MatchRegularExpression | Qt.MatchCaseSensitive, index: 1 }, - { tag: "[coc]+\\w+ (MatchRegularExpression)", term: "[coc]+\\w+", flags: Qt.MatchRegularExpression, index: 2 }, - - { tag: "?pp* (MatchWildcard)", term: "?pp*", flags: Qt.MatchWildcard, index: 3 }, - { tag: "app* (MatchWildcard|MatchCaseSensitive)", term: "app*", flags: Qt.MatchWildcard | Qt.MatchCaseSensitive, index: -1 }, - - { tag: "Banana (MatchFixedString)", term: "Banana", flags: Qt.MatchFixedString, index: 0 }, - { tag: "banana (MatchFixedString|MatchCaseSensitive)", term: "banana", flags: Qt.MatchFixedString | Qt.MatchCaseSensitive, index: 1 }, - - { tag: "coco (MatchStartsWith)", term: "coco", flags: Qt.MatchStartsWith, index: 2 }, - { tag: "coco (MatchStartsWith|MatchCaseSensitive)", term: "coco", flags: Qt.StartsWith | Qt.MatchCaseSensitive, index: -1 }, - - { tag: "MUFFIN (MatchEndsWith)", term: "MUFFIN", flags: Qt.MatchEndsWith, index: 4 }, - { tag: "MUFFIN (MatchEndsWith|MatchCaseSensitive)", term: "MUFFIN", flags: Qt.MatchEndsWith | Qt.MatchCaseSensitive, index: -1 }, - - { tag: "Con (MatchContains)", term: "Con", flags: Qt.MatchContains, index: 2 }, - { tag: "Con (MatchContains|MatchCaseSensitive)", term: "Con", flags: Qt.MatchContains | Qt.MatchCaseSensitive, index: -1 }, - ] - } - - function test_find(data) { - var control = createTemporaryObject(comboBox, testCase) - verify(control) - - control.model = ["Banana", "banana", "Coconut", "Apple", "Cocomuffin"] - - compare(control.find(data.term, data.flags), data.index) - } - - function test_valueRole_data() { - return [ - { tag: "ListModel", model: fruitmodel }, - { tag: "ObjectArray", model: fruitarray } - ] - } - - function test_valueRole(data) { - var control = createTemporaryObject(emptyBox, testCase, - { model: data.model, valueRole: "color" }) - verify(control) - compare(control.count, 3) - compare(control.currentIndex, 0) - compare(control.currentValue, "red") - - control.valueRole = "name" - compare(control.currentValue, "Apple") - - control.currentIndex = 1 - compare(control.currentIndex, 1) - compare(control.currentValue, "Orange") - - control.valueRole = "color" - compare(control.currentValue, "orange") - - control.model = null - compare(control.currentIndex, -1) - // An invalid QVariant is represented as undefined. - compare(control.currentValue, undefined) - - control.valueRole = "" - compare(control.currentValue, undefined) - } - - function test_valueAt() { - var control = createTemporaryObject(comboBox, testCase, - { model: fruitmodel, textRole: "name", valueRole: "color" }) - verify(control) - - compare(control.valueAt(0), "red") - compare(control.valueAt(1), "orange") - compare(control.valueAt(2), "yellow") - compare(control.valueAt(-1), undefined) - compare(control.valueAt(5), undefined) - } - - function test_indexOfValue_data() { - return [ - { tag: "red", expectedIndex: 0 }, - { tag: "orange", expectedIndex: 1 }, - { tag: "yellow", expectedIndex: 2 }, - { tag: "brown", expectedIndex: -1 }, - ] - } - - function test_indexOfValue(data) { - var control = createTemporaryObject(comboBox, testCase, - { model: fruitmodel, textRole: "name", valueRole: "color" }) - verify(control) - - compare(control.indexOfValue(data.tag), data.expectedIndex) - } - - function test_currentValueAfterModelChanged() { - let fruitModel = createTemporaryObject(fruitModelComponent, testCase) - verify(fruitModel) - - let control = createTemporaryObject(comboBox, testCase, - { model: fruitModel, textRole: "name", valueRole: "color", currentIndex: 1 }) - verify(control) - compare(control.currentText, "Orange") - compare(control.currentValue, "orange") - - // Remove "Apple"; the current item should now be "Banana", so currentValue should be "yellow". - fruitModel.remove(0) - compare(control.currentText, "Banana") - compare(control.currentValue, "yellow") - } - - function test_currentValueAfterNewModelSet() { - let control = createTemporaryObject(comboBox, testCase, - { model: fruitmodel, textRole: "name", valueRole: "color", currentIndex: 0 }) - verify(control) - compare(control.currentText, "Apple") - compare(control.currentValue, "red") - - // Swap the model out entirely. Since the currentIndex was 0 and - // is reset to 0 when a new model is set, it remains 0. - let birdModel = createTemporaryObject(birdModelComponent, testCase) - verify(birdModel) - control.model = birdModel - compare(control.currentText, "Galah") - compare(control.currentValue, "pink") - } - - function test_arrowKeys() { - var control = createTemporaryObject(comboBox, testCase, - { model: fruitmodel, textRole: "name", valueRole: "color" }) - verify(control) - - var activatedSpy = signalSpy.createObject(control, {target: control, signalName: "activated"}) - verify(activatedSpy.valid) - - var highlightedSpy = signalSpy.createObject(control, {target: control, signalName: "highlighted"}) - verify(highlightedSpy.valid) - - var openedSpy = signalSpy.createObject(control, {target: control.popup, signalName: "opened"}) - verify(openedSpy.valid) - - var closedSpy = signalSpy.createObject(control, {target: control.popup, signalName: "closed"}) - verify(closedSpy.valid) - - control.forceActiveFocus() - verify(control.activeFocus) - - compare(control.currentIndex, 0) - compare(control.highlightedIndex, -1) - - keyClick(Qt.Key_Down) - compare(control.currentIndex, 1) - compare(control.highlightedIndex, -1) - compare(highlightedSpy.count, 0) - compare(activatedSpy.count, 1) - compare(activatedSpy.signalArguments[0][0], 1) - activatedSpy.clear() - - keyClick(Qt.Key_Down) - compare(control.currentIndex, 2) - compare(control.highlightedIndex, -1) - compare(highlightedSpy.count, 0) - compare(activatedSpy.count, 1) - compare(activatedSpy.signalArguments[0][0], 2) - activatedSpy.clear() - - keyClick(Qt.Key_Down) - compare(control.currentIndex, 2) - compare(control.highlightedIndex, -1) - compare(highlightedSpy.count, 0) - compare(activatedSpy.count, 0) - - keyClick(Qt.Key_Up) - compare(control.currentIndex, 1) - compare(control.highlightedIndex, -1) - compare(highlightedSpy.count, 0) - compare(activatedSpy.count, 1) - compare(activatedSpy.signalArguments[0][0], 1) - activatedSpy.clear() - - keyClick(Qt.Key_Up) - compare(control.currentIndex, 0) - compare(control.highlightedIndex, -1) - compare(highlightedSpy.count, 0) - compare(activatedSpy.count, 1) - compare(activatedSpy.signalArguments[0][0], 0) - activatedSpy.clear() - - keyClick(Qt.Key_Up) - compare(control.currentIndex, 0) - compare(control.highlightedIndex, -1) - compare(highlightedSpy.count, 0) - compare(activatedSpy.count, 0) - - // show popup - keyClick(Qt.Key_Space) - openedSpy.wait() - compare(openedSpy.count, 1) - - compare(control.currentIndex, 0) - compare(control.highlightedIndex, 0) - - keyClick(Qt.Key_Down) - compare(control.currentIndex, 0) - compare(control.highlightedIndex, 1) - compare(activatedSpy.count, 0) - compare(highlightedSpy.count, 1) - compare(highlightedSpy.signalArguments[0][0], 1) - highlightedSpy.clear() - - keyClick(Qt.Key_Down) - compare(control.currentIndex, 0) - compare(control.highlightedIndex, 2) - compare(activatedSpy.count, 0) - compare(highlightedSpy.count, 1) - compare(highlightedSpy.signalArguments[0][0], 2) - highlightedSpy.clear() - - keyClick(Qt.Key_Down) - compare(control.currentIndex, 0) - compare(control.highlightedIndex, 2) - compare(activatedSpy.count, 0) - compare(highlightedSpy.count, 0) - - keyClick(Qt.Key_Up) - compare(control.currentIndex, 0) - compare(control.highlightedIndex, 1) - compare(activatedSpy.count, 0) - compare(highlightedSpy.count, 1) - compare(highlightedSpy.signalArguments[0][0], 1) - highlightedSpy.clear() - - keyClick(Qt.Key_Up) - compare(control.currentIndex, 0) - compare(control.highlightedIndex, 0) - compare(activatedSpy.count, 0) - compare(highlightedSpy.count, 1) - compare(highlightedSpy.signalArguments[0][0], 0) - highlightedSpy.clear() - - keyClick(Qt.Key_Up) - compare(control.currentIndex, 0) - compare(control.highlightedIndex, 0) - compare(activatedSpy.count, 0) - compare(highlightedSpy.count, 0) - - keyClick(Qt.Key_Down) - compare(control.currentIndex, 0) - compare(control.highlightedIndex, 1) - compare(activatedSpy.count, 0) - compare(highlightedSpy.count, 1) - compare(highlightedSpy.signalArguments[0][0], 1) - highlightedSpy.clear() - - // hide popup - keyClick(Qt.Key_Space) - closedSpy.wait() - compare(closedSpy.count, 1) - - compare(control.currentIndex, 1) - compare(control.highlightedIndex, -1) - } - - function test_keys_space_enter_escape_data() { - return [ - { tag: "space-space", key1: Qt.Key_Space, key2: Qt.Key_Space, showPopup: true, showPress: true, hidePopup: true, hidePress: true }, - { tag: "space-enter", key1: Qt.Key_Space, key2: Qt.Key_Enter, showPopup: true, showPress: true, hidePopup: true, hidePress: true }, - { tag: "space-return", key1: Qt.Key_Space, key2: Qt.Key_Return, showPopup: true, showPress: true, hidePopup: true, hidePress: true }, - { tag: "space-escape", key1: Qt.Key_Space, key2: Qt.Key_Escape, showPopup: true, showPress: true, hidePopup: true, hidePress: false }, - { tag: "space-0", key1: Qt.Key_Space, key2: Qt.Key_0, showPopup: true, showPress: true, hidePopup: false, hidePress: false }, - { tag: "enter-enter", key1: Qt.Key_Enter, key2: Qt.Key_Enter, showPopup: false, showPress: false, hidePopup: true, hidePress: false }, - { tag: "return-return", key1: Qt.Key_Return, key2: Qt.Key_Return, showPopup: false, showPress: false, hidePopup: true, hidePress: false }, - { tag: "escape-escape", key1: Qt.Key_Escape, key2: Qt.Key_Escape, showPopup: false, showPress: false, hidePopup: true, hidePress: false } - ] - } - - function test_keys_space_enter_escape(data) { - var control = createTemporaryObject(comboBox, testCase, {model: 3}) - verify(control) - - var openedSpy = signalSpy.createObject(control, {target: control.popup, signalName: "opened"}) - verify(openedSpy.valid) - - control.forceActiveFocus() - verify(control.activeFocus) - - compare(control.pressed, false) - compare(control.popup.visible, false) - - // show popup - keyPress(data.key1) - compare(control.pressed, data.showPress) - compare(control.popup.visible, false) - keyRelease(data.key1) - compare(control.pressed, false) - compare(control.popup.visible, data.showPopup) - if (data.showPopup) - openedSpy.wait() - - // hide popup - keyPress(data.key2) - compare(control.pressed, data.hidePress) - keyRelease(data.key2) - compare(control.pressed, false) - tryCompare(control.popup, "visible", !data.hidePopup) - } - - function test_keys_home_end() { - var control = createTemporaryObject(comboBox, testCase, {model: 5}) - verify(control) - - control.forceActiveFocus() - verify(control.activeFocus) - compare(control.currentIndex, 0) - compare(control.highlightedIndex, -1) - - var activatedCount = 0 - var activatedSpy = signalSpy.createObject(control, {target: control, signalName: "activated"}) - verify(activatedSpy.valid) - - var highlightedCount = 0 - var highlightedSpy = signalSpy.createObject(control, {target: control, signalName: "highlighted"}) - verify(highlightedSpy.valid) - - var currentIndexCount = 0 - var currentIndexSpy = signalSpy.createObject(control, {target: control, signalName: "currentIndexChanged"}) - verify(currentIndexSpy.valid) - - var highlightedIndexCount = 0 - var highlightedIndexSpy = signalSpy.createObject(control, {target: control, signalName: "highlightedIndexChanged"}) - verify(highlightedIndexSpy.valid) - - // end (popup closed) - keyClick(Qt.Key_End) - compare(control.currentIndex, 4) - compare(currentIndexSpy.count, ++currentIndexCount) - - compare(control.highlightedIndex, -1) - compare(highlightedIndexSpy.count, highlightedIndexCount) - - compare(activatedSpy.count, ++activatedCount) - compare(activatedSpy.signalArguments[activatedCount-1][0], 4) - - compare(highlightedSpy.count, highlightedCount) - - // repeat (no changes/signals) - keyClick(Qt.Key_End) - compare(currentIndexSpy.count, currentIndexCount) - compare(highlightedIndexSpy.count, highlightedIndexCount) - compare(activatedSpy.count, activatedCount) - compare(highlightedSpy.count, highlightedCount) - - // home (popup closed) - keyClick(Qt.Key_Home) - compare(control.currentIndex, 0) - compare(currentIndexSpy.count, ++currentIndexCount) - - compare(control.highlightedIndex, -1) - compare(highlightedIndexSpy.count, highlightedIndexCount) - - compare(activatedSpy.count, ++activatedCount) - compare(activatedSpy.signalArguments[activatedCount-1][0], 0) - - compare(highlightedSpy.count, highlightedCount) - - // repeat (no changes/signals) - keyClick(Qt.Key_Home) - compare(currentIndexSpy.count, currentIndexCount) - compare(highlightedIndexSpy.count, highlightedIndexCount) - compare(activatedSpy.count, activatedCount) - compare(highlightedSpy.count, highlightedCount) - - control.popup.open() - compare(control.highlightedIndex, 0) - compare(highlightedIndexSpy.count, ++highlightedIndexCount) - compare(highlightedSpy.count, highlightedCount) - - // end (popup open) - keyClick(Qt.Key_End) - compare(control.currentIndex, 0) - compare(currentIndexSpy.count, currentIndexCount) - - compare(control.highlightedIndex, 4) - compare(highlightedIndexSpy.count, ++highlightedIndexCount) - - compare(activatedSpy.count, activatedCount) - - compare(highlightedSpy.count, ++highlightedCount) - compare(highlightedSpy.signalArguments[highlightedCount-1][0], 4) - - // repeat (no changes/signals) - keyClick(Qt.Key_End) - compare(currentIndexSpy.count, currentIndexCount) - compare(highlightedIndexSpy.count, highlightedIndexCount) - compare(activatedSpy.count, activatedCount) - compare(highlightedSpy.count, highlightedCount) - - // home (popup open) - keyClick(Qt.Key_Home) - compare(control.currentIndex, 0) - compare(currentIndexSpy.count, currentIndexCount) - - compare(control.highlightedIndex, 0) - compare(highlightedIndexSpy.count, ++highlightedIndexCount) - - compare(activatedSpy.count, activatedCount) - - compare(highlightedSpy.count, ++highlightedCount) - compare(highlightedSpy.signalArguments[highlightedCount-1][0], 0) - - // repeat (no changes/signals) - keyClick(Qt.Key_Home) - compare(currentIndexSpy.count, currentIndexCount) - compare(highlightedIndexSpy.count, highlightedIndexCount) - compare(activatedSpy.count, activatedCount) - compare(highlightedSpy.count, highlightedCount) - } - - function test_keySearch() { - var control = createTemporaryObject(comboBox, testCase, {model: ["Banana", "Coco", "Coconut", "Apple", "Cocomuffin"]}) - verify(control) - - control.forceActiveFocus() - verify(control.activeFocus) - - compare(control.currentIndex, 0) - compare(control.currentText, "Banana") - compare(control.highlightedIndex, -1) - - keyPress(Qt.Key_C) - compare(control.currentIndex, 1) - compare(control.currentText, "Coco") - compare(control.highlightedIndex, -1) - - // no match - keyPress(Qt.Key_N) - compare(control.currentIndex, 1) - compare(control.currentText, "Coco") - compare(control.highlightedIndex, -1) - - keyPress(Qt.Key_C) - compare(control.currentIndex, 2) - compare(control.currentText, "Coconut") - compare(control.highlightedIndex, -1) - - keyPress(Qt.Key_C) - compare(control.currentIndex, 4) - compare(control.currentText, "Cocomuffin") - compare(control.highlightedIndex, -1) - - // wrap - keyPress(Qt.Key_C) - compare(control.currentIndex, 1) - compare(control.currentText, "Coco") - compare(control.highlightedIndex, -1) - - keyPress(Qt.Key_A) - compare(control.currentIndex, 3) - compare(control.currentText, "Apple") - compare(control.highlightedIndex, -1) - - keyPress(Qt.Key_B) - compare(control.currentIndex, 0) - compare(control.currentText, "Banana") - compare(control.highlightedIndex, -1) - - // popup - control.popup.open() - tryCompare(control.popup, "opened", true) - - compare(control.currentIndex, 0) - compare(control.highlightedIndex, 0) - - keyClick(Qt.Key_C) - compare(control.highlightedIndex, 1) // "Coco" - compare(control.currentIndex, 0) - - // no match - keyClick(Qt.Key_N) - compare(control.highlightedIndex, 1) - compare(control.currentIndex, 0) - - keyClick(Qt.Key_C) - compare(control.highlightedIndex, 2) // "Coconut" - compare(control.currentIndex, 0) - - keyClick(Qt.Key_C) - compare(control.highlightedIndex, 4) // "Cocomuffin" - compare(control.currentIndex, 0) - - // wrap - keyClick(Qt.Key_C) - compare(control.highlightedIndex, 1) // "Coco" - compare(control.currentIndex, 0) - - keyClick(Qt.Key_B) - compare(control.highlightedIndex, 0) // "Banana" - compare(control.currentIndex, 0) - - keyClick(Qt.Key_A) - compare(control.highlightedIndex, 3) // "Apple" - compare(control.currentIndex, 0) - - verify(control.popup.visible) - - // accept - keyClick(Qt.Key_Return) - tryCompare(control.popup, "visible", false) - compare(control.currentIndex, 3) - compare(control.currentText, "Apple") - compare(control.highlightedIndex, -1) - } - - function test_popup() { - var control = createTemporaryObject(comboBox, testCase, {model: 3}) - verify(control) - - // show below - mousePress(control) - compare(control.pressed, true) - compare(control.popup.visible, false) - mouseRelease(control) - compare(control.pressed, false) - compare(control.popup.visible, true) - verify(control.popup.contentItem.y >= control.y) - - // hide - mouseClick(control) - compare(control.pressed, false) - tryCompare(control.popup, "visible", false) - - // show above - control.y = control.Window.height - control.height - mousePress(control) - compare(control.pressed, true) - compare(control.popup.visible, false) - mouseRelease(control) - compare(control.pressed, false) - compare(control.popup.visible, true) - verify(control.popup.contentItem.y < control.y) - - - // Account for when a transition of a scale from 0.9-1.0 that it is placed above right away and not below - // first just because there is room at the 0.9 scale - if (control.popup.enter !== null) { - // hide - mouseClick(control) - compare(control.pressed, false) - tryCompare(control.popup, "visible", false) - control.y = control.Window.height - (control.popup.contentItem.height * 0.99) - var popupYSpy = createTemporaryObject(signalSpy, testCase, {target: control.popup, signalName: "yChanged"}) - verify(popupYSpy.valid) - mousePress(control) - compare(control.pressed, true) - compare(control.popup.visible, false) - mouseRelease(control) - compare(control.pressed, false) - compare(control.popup.visible, true) - tryCompare(control.popup.enter, "running", false) - verify(control.popup.contentItem.y < control.y) - verify(popupYSpy.count === 1) - } - - // follow the control outside the horizontal window bounds - control.x = -control.width / 2 - compare(control.x, -control.width / 2) - compare(control.popup.contentItem.parent.x, -control.width / 2) - control.x = testCase.width - control.width / 2 - compare(control.x, testCase.width - control.width / 2) - compare(control.popup.contentItem.parent.x, testCase.width - control.width / 2) - - // close the popup when hidden (QTBUG-67684) - control.popup.open() - tryCompare(control.popup, "opened", true) - control.visible = false - tryCompare(control.popup, "visible", false) - } - - Component { - id: reopenCombo - Window { - property alias innerCombo: innerCombo - visible: true - width: 300 - height: 300 - ComboBox { - id: innerCombo - model: 10 - anchors.verticalCenter: parent.verticalCenter - } - } - } - - // This test checks that when reopening the combobox that it is still appears at the same y position as - // previously - function test_reopen_popup() { - var control = createTemporaryObject(reopenCombo, testCase) - verify(control) - var y = 0; - for (var i = 0; i < 2; ++i) { - tryCompare(control.innerCombo.popup, "visible", false) - control.innerCombo.y = control.height - (control.innerCombo.popup.contentItem.height * 0.99) - var popupYSpy = createTemporaryObject(signalSpy, testCase, {target: control.innerCombo.popup, signalName: "yChanged"}) - verify(popupYSpy.valid) - mousePress(control.innerCombo) - compare(control.innerCombo.pressed, true) - compare(control.innerCombo.popup.visible, false) - mouseRelease(control.innerCombo) - compare(control.innerCombo.pressed, false) - compare(control.innerCombo.popup.visible, true) - if (control.innerCombo.popup.enter) - tryCompare(control.innerCombo.popup.enter, "running", false) - // Check on the second opening that it has the same y position as before - if (i !== 0) { - // y should not have changed again - verify(popupYSpy.count === 0) - verify(y === control.innerCombo.popup.y) - } else { - // In some cases on the initial show, y changes more than once - verify(popupYSpy.count >= 1) - y = control.innerCombo.popup.y - mouseClick(control.innerCombo) - compare(control.innerCombo.pressed, false) - tryCompare(control.innerCombo.popup, "visible", false) - } - } - } - - function test_mouse() { - var control = createTemporaryObject(comboBox, testCase, {model: 3, hoverEnabled: false}) - verify(control) - - var activatedSpy = signalSpy.createObject(control, {target: control, signalName: "activated"}) - verify(activatedSpy.valid) - - mouseClick(control) - compare(control.popup.visible, true) - - var content = control.popup.contentItem - waitForRendering(content) - - // press - move - release outside - not activated - not closed - mousePress(content) - compare(activatedSpy.count, 0) - mouseMove(content, content.width * 2) - compare(activatedSpy.count, 0) - mouseRelease(content, content.width * 2) - compare(activatedSpy.count, 0) - compare(control.popup.visible, true) - - // press - move - release inside - activated - closed - mousePress(content) - compare(activatedSpy.count, 0) - mouseMove(content, content.width / 2 + 1, content.height / 2 + 1) - compare(activatedSpy.count, 0) - mouseRelease(content) - compare(activatedSpy.count, 1) - tryCompare(control.popup, "visible", false) - } - - function test_touch() { - var control = createTemporaryObject(comboBox, testCase, {model: 3}) - verify(control) - - var touch = touchEvent(control) - - var activatedSpy = signalSpy.createObject(control, {target: control, signalName: "activated"}) - verify(activatedSpy.valid) - - var highlightedSpy = signalSpy.createObject(control, {target: control, signalName: "highlighted"}) - verify(highlightedSpy.valid) - - touch.press(0, control).commit() - touch.release(0, control).commit() - compare(control.popup.visible, true) - - var content = control.popup.contentItem - waitForRendering(content) - - // press - move - release outside - not activated - not closed - touch.press(0, control).commit() - compare(activatedSpy.count, 0) - compare(highlightedSpy.count, 0) - touch.move(0, control, control.width * 2, control.height / 2).commit() - compare(activatedSpy.count, 0) - compare(highlightedSpy.count, 0) - touch.release(0, control, control.width * 2, control.height / 2).commit() - compare(activatedSpy.count, 0) - compare(highlightedSpy.count, 0) - compare(control.popup.visible, true) - - // press - move - release inside - activated - closed - touch.press(0, content).commit() - compare(activatedSpy.count, 0) - compare(highlightedSpy.count, 0) - touch.move(0, content, content.width / 2 + 1, content.height / 2 + 1).commit() - compare(activatedSpy.count, 0) - compare(highlightedSpy.count, 0) - touch.release(0, content).commit() - compare(activatedSpy.count, 1) - compare(highlightedSpy.count, 1) - tryCompare(control.popup, "visible", false) - } - - function test_down() { - var control = createTemporaryObject(comboBox, testCase, {model: 3}) - verify(control) - - // some styles position the popup over the combo button. move it out - // of the way to avoid stealing mouse presses. we want to test the - // combinations of the button being pressed and the popup being visible. - control.popup.y = control.height - - var downSpy = signalSpy.createObject(control, {target: control, signalName: "downChanged"}) - verify(downSpy.valid) - - var pressedSpy = signalSpy.createObject(control, {target: control, signalName: "pressedChanged"}) - verify(pressedSpy.valid) - - mousePress(control) - compare(control.popup.visible, false) - compare(control.pressed, true) - compare(control.down, true) - compare(downSpy.count, 1) - compare(pressedSpy.count, 1) - - mouseRelease(control) - compare(control.popup.visible, true) - compare(control.pressed, false) - compare(control.down, true) - compare(downSpy.count, 3) - compare(pressedSpy.count, 2) - - compare(control.popup.y, control.height) - - control.down = false - compare(control.down, false) - compare(downSpy.count, 4) - - mousePress(control) - compare(control.popup.visible, true) - compare(control.pressed, true) - compare(control.down, false) // explicit false - compare(downSpy.count, 4) - compare(pressedSpy.count, 3) - - control.down = undefined - compare(control.down, true) - compare(downSpy.count, 5) - - mouseRelease(control) - tryCompare(control.popup, "visible", false) - compare(control.pressed, false) - compare(control.down, false) - compare(downSpy.count, 6) - compare(pressedSpy.count, 4) - - control.popup.open() - compare(control.popup.visible, true) - compare(control.pressed, false) - compare(control.down, true) - compare(downSpy.count, 7) - compare(pressedSpy.count, 4) - - control.popup.close() - tryCompare(control.popup, "visible", false) - compare(control.pressed, false) - compare(control.down, false) - compare(downSpy.count, 8) - compare(pressedSpy.count, 4) - } - - function test_focus() { - var control = createTemporaryObject(comboBox, testCase, {model: 3}) - verify(control) - - var openedSpy = signalSpy.createObject(control, {target: control.popup, signalName: "opened"}) - verify(openedSpy.valid) - - var closedSpy = signalSpy.createObject(control, {target: control.popup, signalName: "closed"}) - verify(openedSpy.valid) - - // click - gain focus - show popup - mouseClick(control) - verify(control.activeFocus) - openedSpy.wait() - compare(openedSpy.count, 1) - compare(control.popup.visible, true) - - // lose focus - hide popup - control.focus = false - verify(!control.activeFocus) - closedSpy.wait() - compare(closedSpy.count, 1) - compare(control.popup.visible, false) - } - - function test_baseline() { - var control = createTemporaryObject(comboBox, testCase) - verify(control) - compare(control.baselineOffset, control.contentItem.y + control.contentItem.baselineOffset) - } - - Component { - id: displayBox - ComboBox { - textRole: "key" - model: ListModel { - ListElement { key: "First"; value: 123 } - ListElement { key: "Second"; value: 456 } - ListElement { key: "Third"; value: 789 } - } - } - } - - function test_displayText() { - var control = createTemporaryObject(displayBox, testCase) - verify(control) - - compare(control.displayText, "First") - control.currentIndex = 1 - compare(control.displayText, "Second") - control.textRole = "value" - compare(control.displayText, "456") - control.displayText = "Display" - compare(control.displayText, "Display") - control.currentIndex = 2 - compare(control.displayText, "Display") - control.displayText = undefined - compare(control.displayText, "789") - } - - Component { - id: component - Pane { - id: panel - property alias button: _button; - property alias combobox: _combobox; - font.pixelSize: 30 - Column { - Button { - id: _button - text: "Button" - font.pixelSize: 20 - } - ComboBox { - id: _combobox - model: ["ComboBox", "With"] - delegate: ItemDelegate { - width: _combobox.width - text: _combobox.textRole ? (Array.isArray(_combobox.model) ? modelData[_combobox.textRole] : model[_combobox.textRole]) : modelData - objectName: "delegate" - autoExclusive: true - checked: _combobox.currentIndex === index - highlighted: _combobox.highlightedIndex === index - } - } - } - } - } - - function getChild(control, objname, idx) { - var index = idx - for (var i = index+1; i < control.children.length; i++) - { - if (control.children[i].objectName === objname) { - index = i - break - } - } - return index - } - - function test_font() { // QTBUG_50984, QTBUG-51696 - var control = createTemporaryObject(component, testCase) - verify(control) - verify(control.button) - verify(control.combobox) - - compare(control.font.pixelSize, 30) - compare(control.button.font.pixelSize, 20) - compare(control.combobox.font.pixelSize, 30) - -// verify(control.combobox.popup) -// var popup = control.combobox.popup -// popup.open() - -// verify(popup.contentItem) - -// var listview = popup.contentItem -// verify(listview.contentItem) -// waitForRendering(listview) - -// var idx1 = getChild(listview.contentItem, "delegate", -1) -// compare(listview.contentItem.children[idx1].font.pixelSize, 25) -// var idx2 = getChild(listview.contentItem, "delegate", idx1) -// compare(listview.contentItem.children[idx2].font.pixelSize, 25) - -// compare(listview.contentItem.children[idx1].font.pixelSize, 25) -// compare(listview.contentItem.children[idx2].font.pixelSize, 25) - - control.font.pixelSize = control.font.pixelSize + 10 - compare(control.combobox.font.pixelSize, 40) -// waitForRendering(listview) -// compare(listview.contentItem.children[idx1].font.pixelSize, 25) -// compare(listview.contentItem.children[idx2].font.pixelSize, 25) - - control.combobox.font.pixelSize = control.combobox.font.pixelSize + 5 - compare(control.combobox.font.pixelSize, 45) -// waitForRendering(listview) - -// idx1 = getChild(listview.contentItem, "delegate", -1) -// compare(listview.contentItem.children[idx1].font.pixelSize, 25) -// idx2 = getChild(listview.contentItem, "delegate", idx1) -// compare(listview.contentItem.children[idx2].font.pixelSize, 25) - } - - function test_wheel() { - var ma = createTemporaryObject(mouseArea, testCase, {width: 100, height: 100}) - verify(ma) - - var control = comboBox.createObject(ma, {model: 2, wheelEnabled: true}) - verify(control) - - var delta = 120 - - var spy = signalSpy.createObject(ma, {target: ma, signalName: "wheel"}) - verify(spy.valid) - - mouseWheel(control, control.width / 2, control.height / 2, -delta, -delta) - compare(control.currentIndex, 1) - compare(spy.count, 0) // no propagation - - // reached bounds -> no change - mouseWheel(control, control.width / 2, control.height / 2, -delta, -delta) - compare(control.currentIndex, 1) - compare(spy.count, 0) // no propagation - - mouseWheel(control, control.width / 2, control.height / 2, delta, delta) - compare(control.currentIndex, 0) - compare(spy.count, 0) // no propagation - - // reached bounds -> no change - mouseWheel(control, control.width / 2, control.height / 2, delta, delta) - compare(control.currentIndex, 0) - compare(spy.count, 0) // no propagation - } - - function test_activation_data() { - return [ - { tag: "open:enter", key: Qt.Key_Enter, open: true }, - { tag: "open:return", key: Qt.Key_Return, open: true }, - { tag: "closed:enter", key: Qt.Key_Enter, open: false }, - { tag: "closed:return", key: Qt.Key_Return, open: false } - ] - } - - // QTBUG-51645 - function test_activation(data) { - var control = createTemporaryObject(comboBox, testCase, {currentIndex: 1, model: ["Apple", "Orange", "Banana"]}) - verify(control) - - control.forceActiveFocus() - verify(control.activeFocus) - - if (data.open) { - var openedSpy = signalSpy.createObject(control, {target: control.popup, signalName: "opened"}) - verify(openedSpy.valid) - - keyClick(Qt.Key_Space) - openedSpy.wait() - compare(openedSpy.count, 1) - } - compare(control.popup.visible, data.open) - - compare(control.currentIndex, 1) - compare(control.currentText, "Orange") - compare(control.displayText, "Orange") - - keyClick(data.key) - - compare(control.currentIndex, 1) - compare(control.currentText, "Orange") - compare(control.displayText, "Orange") - } - - Component { - id: asyncLoader - Loader { - active: false - asynchronous: true - sourceComponent: ComboBox { - model: ["First", "Second", "Third"] - } - } - } - - // QTBUG-51972 - function test_async() { - var loader = createTemporaryObject(asyncLoader, testCase) - verify(loader) - - loader.active = true - tryCompare(loader, "status", Loader.Ready) - verify(loader.item) - compare(loader.item.currentText, "First") - compare(loader.item.displayText, "First") - } - - // QTBUG-52615 - function test_currentIndex() { - var control = createTemporaryObject(comboBox, testCase, {currentIndex: -1, model: 3}) - verify(control) - - compare(control.currentIndex, -1) - } - - ListModel { - id: resetmodel - ListElement { text: "First" } - ListElement { text: "Second" } - ListElement { text: "Third" } - } - - // QTBUG-54573 - function test_modelReset() { - var control = createTemporaryObject(comboBox, testCase, {model: resetmodel}) - verify(control) - control.popup.open() - - var listview = control.popup.contentItem - verify(listview) - - tryCompare(listview.contentItem.children, "length", resetmodel.count + 1) // + highlight item - - resetmodel.clear() - resetmodel.append({text: "Fourth"}) - resetmodel.append({text: "Fifth"}) - - tryCompare(listview.contentItem.children, "length", resetmodel.count + 1) // + highlight item - } - - // QTBUG-55118 - function test_currentText() { - var control = createTemporaryObject(comboBox, testCase, {model: listmodel}) - verify(control) - - compare(control.currentIndex, 0) - compare(control.currentText, "First") - - listmodel.setProperty(0, "text", "1st") - compare(control.currentText, "1st") - - control.currentIndex = 1 - compare(control.currentText, "Second") - - listmodel.setProperty(0, "text", "First") - compare(control.currentText, "Second") - } - - // QTBUG-55030 - function test_highlightRange() { - var control = createTemporaryObject(comboBox, testCase, {model: 100}) - verify(control) - - control.currentIndex = 50 - compare(control.currentIndex, 50) - compare(control.highlightedIndex, -1) - - var openedSpy = signalSpy.createObject(control, {target: control.popup, signalName: "opened"}) - verify(openedSpy.valid) - - control.popup.open() - compare(control.highlightedIndex, 50) - tryCompare(openedSpy, "count", 1) - - var listview = control.popup.contentItem - verify(listview) - - var first = listview.itemAt(0, listview.contentY) - verify(first) - compare(first.text, "50") - - var closedSpy = signalSpy.createObject(control, {target: control.popup, signalName: "closed"}) - verify(closedSpy.valid) - - control.popup.close() - tryCompare(closedSpy, "count", 1) - compare(control.highlightedIndex, -1) - - control.currentIndex = 99 - compare(control.currentIndex, 99) - compare(control.highlightedIndex, -1) - - control.popup.open() - compare(control.highlightedIndex, 99) - tryCompare(openedSpy, "count", 2) - tryVerify(function() { return listview.height > 0 }) - - var last = listview.itemAt(0, listview.contentY + listview.height - 1) - verify(last) - compare(last.text, "99") - - openedSpy.target = null - closedSpy.target = null - } - - function test_mouseHighlight() { - if ((Qt.platform.pluginName === "offscreen") - || (Qt.platform.pluginName === "minimal")) - skip("Mouse highlight not functional on offscreen/minimal platforms") - var control = createTemporaryObject(comboBox, testCase, {model: 20}) - verify(control) - - compare(control.highlightedIndex, -1) - - var openedSpy = signalSpy.createObject(control, {target: control.popup, signalName: "opened"}) - verify(openedSpy.valid) - - control.popup.open() - compare(control.highlightedIndex, 0) - tryCompare(openedSpy, "count", 1) - - var listview = control.popup.contentItem - verify(listview) - waitForRendering(listview) - - // hover-highlight through all visible list items one by one - var hoverIndex = -1 - var prevHoverItem = null - for (var y = 0; y < listview.height; ++y) { - var hoverItem = listview.itemAt(0, listview.contentY + y) - if (!hoverItem || !hoverItem.visible || hoverItem === prevHoverItem) - continue - mouseMove(hoverItem, 0, 0) - tryCompare(control, "highlightedIndex", ++hoverIndex) - prevHoverItem = hoverItem - } - - mouseMove(listview, listview.width / 2, listview.height / 2) - - // wheel-highlight the rest of the items - var delta = 120 - var prevWheelItem = null - while (!listview.atYEnd) { - var prevContentY = listview.contentY - mouseWheel(listview, listview.width / 2, listview.height / 2, -delta, -delta) - tryCompare(listview, "moving", false) - verify(listview.contentY > prevContentY) - - var wheelItem = listview.itemAt(listview.width / 2, listview.contentY + listview.height / 2) - if (!wheelItem || !wheelItem.visible || wheelItem === prevWheelItem) - continue - - tryCompare(control, "highlightedIndex", parseInt(wheelItem.text)) - prevWheelItem = wheelItem - } - } - - RegularExpressionValidator { - id: regExpValidator - regularExpression: /(red|blue|green)?/ - } - - function test_validator() { - var control = createTemporaryObject(comboBox, testCase, {editable: true, validator: regExpValidator}) - - control.editText = "blu" - compare(control.acceptableInput, false) - control.editText = "blue" - compare(control.acceptableInput, true) - control.editText = "bluee" - compare(control.acceptableInput, false) - control.editText = "" - compare(control.acceptableInput, true) - control.editText = "" - control.contentItem.forceActiveFocus() - keyPress(Qt.Key_A) - compare(control.editText, "") - keyPress(Qt.Key_A) - compare(control.editText, "") - keyPress(Qt.Key_R) - compare(control.editText, "r") - keyPress(Qt.Key_A) - compare(control.editText, "r") - compare(control.acceptableInput, false) - keyPress(Qt.Key_E) - compare(control.editText, "re") - compare(control.acceptableInput, false) - keyPress(Qt.Key_D) - compare(control.editText, "red") - compare(control.acceptableInput, true) - } - - Component { - id: appendFindBox - ComboBox { - editable: true - model: ListModel { - ListElement { text:"first" } - } - onAccepted: { - if (find(editText) === -1) - model.append({text: editText}) - } - } - } - - function test_append_find() { - var control = createTemporaryObject(appendFindBox, testCase) - - compare(control.currentIndex, 0) - compare(control.currentText, "first") - control.contentItem.forceActiveFocus() - compare(control.activeFocus, true) - - control.selectAll() - keyPress(Qt.Key_T) - keyPress(Qt.Key_H) - keyPress(Qt.Key_I) - keyPress(Qt.Key_R) - keyPress(Qt.Key_D) - compare(control.count, 1) - compare(control.currentText, "first") - compare(control.editText, "third") - - keyPress(Qt.Key_Enter) - compare(control.count, 2) - compare(control.currentIndex, 1) - compare(control.currentText, "third") - } - - function test_editable() { - var control = createTemporaryObject(comboBox, testCase, {editable: true, model: ["Banana", "Coco", "Coconut", "Apple", "Cocomuffin"]}) - verify(control) - - control.contentItem.forceActiveFocus() - verify(control.activeFocus) - - var acceptCount = 0 - - var acceptSpy = signalSpy.createObject(control, {target: control, signalName: "accepted"}) - verify(acceptSpy.valid) - - compare(control.editText, "Banana") - compare(control.currentText, "Banana") - compare(control.currentIndex, 0) - compare(acceptSpy.count, 0) - control.editText = "" - - keyPress(Qt.Key_C) - compare(control.editText, "coco") - compare(control.currentText, "Banana") - compare(control.currentIndex, 0) - - keyPress(Qt.Key_Right) - keyPress(Qt.Key_N) - compare(control.editText, "coconut") - compare(control.currentText, "Banana") - compare(control.currentIndex, 0) - - keyPress(Qt.Key_Enter) // Accept - compare(control.editText, "Coconut") - compare(control.currentText, "Coconut") - compare(control.currentIndex, 2) - compare(acceptSpy.count, ++acceptCount) - - keyPress(Qt.Key_Backspace) - keyPress(Qt.Key_Backspace) - keyPress(Qt.Key_Backspace) - keyPress(Qt.Key_M) - compare(control.editText, "Cocomuffin") - compare(control.currentText, "Coconut") - compare(control.currentIndex, 2) - - keyPress(Qt.Key_Enter) // Accept - compare(control.editText, "Cocomuffin") - compare(control.currentText, "Cocomuffin") - compare(control.currentIndex, 4) - compare(acceptSpy.count, ++acceptCount) - - keyPress(Qt.Key_Return) // Accept - compare(control.editText, "Cocomuffin") - compare(control.currentText, "Cocomuffin") - compare(control.currentIndex, 4) - compare(acceptSpy.count, ++acceptCount) - - control.editText = "" - compare(control.editText, "") - compare(control.currentText, "Cocomuffin") - compare(control.currentIndex, 4) - - keyPress(Qt.Key_A) - compare(control.editText, "apple") - compare(control.currentText, "Cocomuffin") - compare(control.currentIndex, 4) - - keyPress(Qt.Key_Return) // Accept - compare(control.editText, "Apple") - compare(control.currentText, "Apple") - compare(control.currentIndex, 3) - compare(acceptSpy.count, ++acceptCount) - - control.editText = "" - keyPress(Qt.Key_A) - keyPress(Qt.Key_B) - compare(control.editText, "ab") - compare(control.currentText, "Apple") - compare(control.currentIndex, 3) - - keyPress(Qt.Key_Return) // Accept - compare(control.editText, "ab") - compare(control.currentText, "") - compare(control.currentIndex, -1) - compare(acceptSpy.count, ++acceptCount) - - control.editText = "" - compare(control.editText, "") - compare(control.currentText, "") - compare(control.currentIndex, -1) - - keyPress(Qt.Key_C) - keyPress(Qt.Key_Return) // Accept - compare(control.editText, "Coco") - compare(control.currentText, "Coco") - compare(control.currentIndex, 1) - compare(acceptSpy.count, ++acceptCount) - - keyPress(Qt.Key_Down) - compare(control.editText, "Coconut") - compare(control.currentText, "Coconut") - compare(control.currentIndex, 2) - - keyPress(Qt.Key_Up) - compare(control.editText, "Coco") - compare(control.currentText, "Coco") - compare(control.currentIndex, 1) - - control.editText = "" - compare(control.editText, "") - compare(control.currentText, "Coco") - compare(control.currentIndex, 1) - - 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(control.editText, "coc") - compare(control.currentText, "") - compare(control.currentIndex, -1) - compare(acceptSpy.count, ++acceptCount) - - control.editText = "" - compare(control.editText, "") - compare(control.currentText, "") - compare(control.currentIndex, -1) - - 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(control.editText, "coc ") - compare(control.currentText, "") - compare(control.currentIndex, -1) - compare(acceptSpy.count, ++acceptCount) - } - - Component { - id: keysAttachedBox - ComboBox { - editable: true - property bool gotit: false - Keys.onPressed: { - if (!gotit && event.key === Qt.Key_B) { - gotit = true - event.accepted = true - } - } - } - } - - function test_keys_attached() { - var control = createTemporaryObject(keysAttachedBox, testCase) - verify(control) - - control.contentItem.forceActiveFocus() - verify(control.activeFocus) - - verify(!control.gotit) - compare(control.editText, "") - - keyPress(Qt.Key_A) - verify(control.activeFocus) - verify(!control.gotit) - compare(control.editText, "a") - - keyPress(Qt.Key_B) - verify(control.activeFocus) - verify(control.gotit) - compare(control.editText, "a") - - keyPress(Qt.Key_B) - verify(control.activeFocus) - verify(control.gotit) - compare(control.editText, "ab") - } - - function test_minusOneIndexResetsSelection_QTBUG_35794_data() { - return [ - { tag: "editable", editable: true }, - { tag: "non-editable", editable: false } - ] - } - - function test_minusOneIndexResetsSelection_QTBUG_35794(data) { - var control = createTemporaryObject(comboBox, testCase, {editable: data.editable, model: ["A", "B", "C"]}) - verify(control) - - compare(control.currentIndex, 0) - compare(control.currentText, "A") - control.currentIndex = -1 - compare(control.currentIndex, -1) - compare(control.currentText, "") - control.currentIndex = 1 - compare(control.currentIndex, 1) - compare(control.currentText, "B") - } - - function test_minusOneToZeroSelection_QTBUG_38036() { - var control = createTemporaryObject(comboBox, testCase, {model: ["A", "B", "C"]}) - verify(control) - - compare(control.currentIndex, 0) - compare(control.currentText, "A") - control.currentIndex = -1 - compare(control.currentIndex, -1) - compare(control.currentText, "") - control.currentIndex = 0 - compare(control.currentIndex, 0) - compare(control.currentText, "A") - } - - function test_emptyPopupAfterModelCleared() { - var control = createTemporaryObject(comboBox, testCase, { model: 1 }) - verify(control) - compare(control.popup.implicitHeight, 0) - - // Ensure that it's open so that the popup's implicitHeight changes when we increase the model count. - control.popup.open() - tryCompare(control.popup, "visible", true) - - // Add lots of items to the model. The popup should take up the entire height of the window. - control.model = 100 - compare(control.popup.height, control.Window.height - control.popup.topMargin - control.popup.bottomMargin) - - control.popup.close() - - // Clearing the model should result in a zero height. - control.model = 0 - control.popup.open() - tryCompare(control.popup, "visible", true) - compare(control.popup.height, control.popup.topPadding + control.popup.bottomPadding) - } - - Component { - id: keysMonitor - Item { - property int pressedKeys: 0 - property int releasedKeys: 0 - property int lastPressedKey: 0 - property int lastReleasedKey: 0 - property alias comboBox: comboBox - - width: 200 - height: 200 - - Keys.onPressed: { ++pressedKeys; lastPressedKey = event.key } - Keys.onReleased: { ++releasedKeys; lastReleasedKey = event.key } - - ComboBox { - id: comboBox - } - } - } - - function test_keyClose_data() { - return [ - { tag: "Escape", key: Qt.Key_Escape }, - { tag: "Back", key: Qt.Key_Back } - ] - } - - function test_keyClose(data) { - var container = createTemporaryObject(keysMonitor, testCase) - verify(container) - - var control = comboBox.createObject(container) - verify(control) - - control.forceActiveFocus() - verify(control.activeFocus) - - var pressedKeys = 0 - var releasedKeys = 0 - - // popup not visible -> propagates - keyPress(data.key) - compare(container.pressedKeys, ++pressedKeys) - compare(container.lastPressedKey, data.key) - - keyRelease(data.key) - compare(container.releasedKeys, ++releasedKeys) - compare(container.lastReleasedKey, data.key) - - verify(control.activeFocus) - - // popup visible -> handled -> does not propagate - control.popup.open() - tryCompare(control.popup, "opened", true) - - keyPress(data.key) - compare(container.pressedKeys, pressedKeys) - - keyRelease(data.key) - // Popup receives the key release event if it has an exit transition, but - // not if it has been immediately closed on press, without a transition. - // ### TODO: Should Popup somehow always block the key release event? - if (!control.popup.exit) - ++releasedKeys - compare(container.releasedKeys, releasedKeys) - - tryCompare(control.popup, "visible", false) - verify(control.activeFocus) - - // popup not visible -> propagates - keyPress(data.key) - compare(container.pressedKeys, ++pressedKeys) - compare(container.lastPressedKey, data.key) - - keyRelease(data.key) - compare(container.releasedKeys, ++releasedKeys) - compare(container.lastReleasedKey, data.key) - } - - function test_popupFocus_QTBUG_74661() { - var control = createTemporaryObject(comboBox, testCase) - verify(control) - - var popup = createTemporaryObject(customPopup, testCase) - verify(popup) - - control.popup = popup - - var openedSpy = signalSpy.createObject(control, {target: popup, signalName: "opened"}) - verify(openedSpy.valid) - - var closedSpy = signalSpy.createObject(control, {target: popup, signalName: "closed"}) - verify(closedSpy.valid) - - control.forceActiveFocus() - verify(control.activeFocus) - - // show popup - keyClick(Qt.Key_Space) - openedSpy.wait() - compare(openedSpy.count, 1) - - popup.contentItem.forceActiveFocus() - verify(popup.contentItem.activeFocus) - - // type something in the text field - keyClick(Qt.Key_Space) - keyClick(Qt.Key_H) - keyClick(Qt.Key_I) - compare(popup.contentItem.text, " hi") - - compare(closedSpy.count, 0) - - // hide popup - keyClick(Qt.Key_Escape) - closedSpy.wait() - compare(closedSpy.count, 1) - } - - function test_comboBoxWithShaderEffect() { - var control = createTemporaryObject(comboBoxWithShaderEffect, testCase, {model: 9}) - verify(control) - waitForRendering(control) - control.forceActiveFocus() - var openedSpy = signalSpy.createObject(control, {target: control.popup, signalName: "opened"}) - verify(openedSpy.valid) - - var closedSpy = signalSpy.createObject(control, {target: control.popup, signalName: "closed"}) - verify(closedSpy.valid) - - control.popup.open() - openedSpy.wait() - compare(openedSpy.count, 1) - control.popup.close() - closedSpy.wait() - compare(closedSpy.count, 1) - } - - function test_comboBoxSelectTextByMouse() { - let control = createTemporaryObject(comboBox, testCase, - { editable: true, selectTextByMouse: true, model: [ "Some text" ], width: parent.width }) - verify(control) - waitForRendering(control) - control.forceActiveFocus() - - // Position the text cursor at the beginning of the text. - mouseClick(control, control.leftPadding, control.height / 2) - // Select all of the text. - mousePress(control, control.leftPadding, control.height / 2) - mouseMove(control, control.leftPadding + control.contentItem.width, control.height / 2) - mouseRelease(control, control.leftPadding + control.contentItem.width, control.height / 2) - compare(control.contentItem.selectedText, "Some text") - } - - // QTBUG-78885: When the edit text is changed on an editable ComboBox, - // and then that ComboBox loses focus, its currentIndex should change - // to the index of the edit text (assuming a match is found). - function test_currentIndexChangeOnLostFocus() { - if (Qt.styleHints.tabFocusBehavior !== Qt.TabFocusAllControls) - skip("This platform only allows tab focus for text controls") - - let theModel = [] - for (let i = 0; i < 10; ++i) - theModel.push("Item " + (i + 1)) - - let comboBox1 = createTemporaryObject(comboBox, testCase, - { objectName: "comboBox1", editable: true, model: theModel }) - verify(comboBox1) - compare(comboBox1.currentIndex, 0) - - let comboBox2 = createTemporaryObject(comboBox, testCase, { objectName: "comboBox2" }) - verify(comboBox2) - - // Give the first ComboBox focus and type in 0 to select "Item 10" (default is "Item 1"). - waitForRendering(comboBox1) - comboBox1.contentItem.forceActiveFocus() - verify(comboBox1.activeFocus) - keyClick(Qt.Key_0) - compare(comboBox1.editText, "Item 10") - - let currentIndexSpy = signalSpy.createObject(comboBox1, - { target: comboBox1, signalName: "currentIndexChanged" }) - verify(currentIndexSpy.valid) - - // Give focus to the other ComboBox so that the first one loses it. - // The first ComboBox's currentIndex should change to that of "Item 10". - keyClick(Qt.Key_Tab) - verify(comboBox2.activeFocus) - compare(comboBox1.currentIndex, 9) - compare(currentIndexSpy.count, 1) - - // Give focus back to the first ComboBox, and try the same thing except - // with non-existing text; the currentIndex should not change. - comboBox1.contentItem.forceActiveFocus() - verify(comboBox1.activeFocus) - keySequence(StandardKey.SelectAll) - compare(comboBox1.contentItem.selectedText, "Item 10") - keyClick(Qt.Key_N) - keyClick(Qt.Key_O) - keyClick(Qt.Key_P) - keyClick(Qt.Key_E) - compare(comboBox1.editText, "nope") - compare(comboBox1.currentIndex, 9) - compare(currentIndexSpy.count, 1) - } - - Component { - id: appFontTextFieldComponent - TextField { - objectName: "appFontTextField" - font: Qt.application.font - // We don't want the background's implicit width to interfere with our tests, - // which are about implicit width of the contentItem of ComboBox, which is by default TextField. - background: null - } - } - - Component { - id: appFontContentItemComboBoxComponent - ComboBox { - // Override the contentItem so that the font doesn't vary between styles. - contentItem: TextField { - objectName: "appFontContentItemTextField" - // We do this just to be extra sure that the font never comes from the control, - // as we want it to match that of the TextField in the appFontTextFieldComponent. - font: Qt.application.font - background: null - } - } - } - - Component { - id: twoItemListModelComponent - - ListModel { - ListElement { display: "Short" } - ListElement { display: "Kinda long" } - } - } - - function appendedToModel(model, item) { - if (Array.isArray(model)) { - let newModel = model - newModel.push(item) - return newModel - } - - if (model.hasOwnProperty("append")) { - model.append({ display: item }) - // To account for the fact that changes to a JS array are not seen by the QML engine, - // we need to reassign the entire model and hence return it. For simplicity in the - // calling code, we do it for the ListModel code path too. It should be a no-op. - return model - } - - console.warn("appendedToModel: unrecognised model") - return undefined - } - - function removedFromModel(model, index, count) { - if (Array.isArray(model)) { - let newModel = model - newModel.splice(index, count) - return newModel - } - - if (model.hasOwnProperty("remove")) { - model.remove(index, count) - return model - } - - console.warn("removedFromModel: unrecognised model") - return undefined - } - - // We don't use a data-driven test for the policy because the checks vary a lot based on which enum we're testing. - function test_implicitContentWidthPolicy_ContentItemImplicitWidth() { - // Set ContentItemImplicitWidth and ensure that implicitContentWidth is as wide as the current item - // by comparing it against the implicitWidth of an identical TextField - let control = createTemporaryObject(appFontContentItemComboBoxComponent, testCase, { - model: ["Short", "Kinda long"], - implicitContentWidthPolicy: ComboBox.ContentItemImplicitWidth - }) - verify(control) - compare(control.implicitContentWidthPolicy, ComboBox.ContentItemImplicitWidth) - - let textField = createTemporaryObject(appFontTextFieldComponent, testCase) - verify(textField) - // Don't set any text on textField because we're not accounting for the widest - // text here, so we want to compare it against an empty TextField. - compare(control.implicitContentWidth, textField.implicitWidth) - - textField.font.pixelSize *= 2 - control.font.pixelSize *= 2 - compare(control.implicitContentWidth, textField.implicitWidth) - } - - function test_implicitContentWidthPolicy_WidestText_data() { - return [ - { tag: "Array", model: ["Short", "Kinda long"] }, - { tag: "ListModel", model: twoItemListModelComponent.createObject(testCase) }, - ] - } - - function test_implicitContentWidthPolicy_WidestText(data) { - let control = createTemporaryObject(appFontContentItemComboBoxComponent, testCase, { - model: data.model, - implicitContentWidthPolicy: ComboBox.WidestText - }) - verify(control) - compare(control.implicitContentWidthPolicy, ComboBox.WidestText) - - let textField = createTemporaryObject(appFontTextFieldComponent, testCase) - verify(textField) - textField.text = "Kinda long" - // Note that we don't need to change the current index here, as the implicitContentWidth - // is set to the implicitWidth of the TextField within the ComboBox as if it had the largest - // text from the model set on it. - // We use Math.ceil because TextInput uses qCeil internally, whereas the implicitWidth - // binding for TextField does not. - compare(Math.ceil(control.implicitContentWidth), Math.ceil(textField.implicitWidth)) - - // Add a longer item; it should affect the implicit content width. - let modifiedModel = appendedToModel(data.model, "Moderately long") - control.model = modifiedModel - textField.text = "Moderately long" - compare(Math.ceil(control.implicitContentWidth), Math.ceil(textField.implicitWidth)) - - // Remove the last two items; it should use the only remaining item's width. - modifiedModel = removedFromModel(data.model, 1, 2) - control.model = modifiedModel - compare(control.count, 1) - compare(control.currentText, "Short") - textField.text = "Short" - compare(Math.ceil(control.implicitContentWidth), Math.ceil(textField.implicitWidth)) - - // Changes in font should result in the implicitContentWidth being updated. - textField.font.pixelSize *= 2 - // We have to change the contentItem's font size manually since we break the - // style's binding to the control's font when we set Qt.application.font to it. - control.contentItem.font.pixelSize *= 2 - control.font.pixelSize *= 2 - compare(Math.ceil(control.implicitContentWidth), Math.ceil(textField.implicitWidth)) - } - - function test_implicitContentWidthPolicy_WidestTextWhenCompleted_data() { - return test_implicitContentWidthPolicy_WidestText_data() - } - - function test_implicitContentWidthPolicy_WidestTextWhenCompleted(data) { - let control = createTemporaryObject(appFontContentItemComboBoxComponent, testCase, { - model: data.model, - implicitContentWidthPolicy: ComboBox.WidestTextWhenCompleted - }) - verify(control) - compare(control.implicitContentWidthPolicy, ComboBox.WidestTextWhenCompleted) - - let textField = createTemporaryObject(appFontTextFieldComponent, testCase) - verify(textField) - textField.text = "Kinda long" - compare(Math.ceil(control.implicitContentWidth), Math.ceil(textField.implicitWidth)) - - // Add a longer item; it should not affect the implicit content width - // since we've already accounted for it once. - let modifiedModel = appendedToModel(data.model, "Moderately long") - control.model = modifiedModel - compare(Math.ceil(control.implicitContentWidth), Math.ceil(textField.implicitWidth)) - - // Remove the last two items; it should still not affect the implicit content width. - modifiedModel = removedFromModel(data.model, 1, 2) - control.model = modifiedModel - compare(control.count, 1) - compare(control.currentText, "Short") - compare(Math.ceil(control.implicitContentWidth), Math.ceil(textField.implicitWidth)) - - // Changes in font should not result in the implicitContentWidth being updated. - let oldTextFieldImplicitWidth = textField.implicitWidth - // Changes in font should result in the implicitContentWidth being updated. - textField.font.pixelSize *= 2 - control.contentItem.font.pixelSize *= 2 - control.font.pixelSize *= 2 - compare(Math.ceil(control.implicitContentWidth), Math.ceil(oldTextFieldImplicitWidth)) - } - - // QTBUG-61021: text line should not be focused by default - // It causes (e.g. on Android) showing virtual keyboard when it is not needed - function test_doNotFocusTextLineByDefault() { - var control = createTemporaryObject(comboBox, testCase) - // Focus not set after creating combobox - verify(!control.activeFocus) - verify(!control.contentItem.focus) - - // After setting focus on combobox, text line should not be focused - control.forceActiveFocus() - verify(control.activeFocus) - verify(!control.contentItem.focus) - - // Text line is focused after intentional setting focus on it - control.contentItem.forceActiveFocus() - verify(control.activeFocus) - verify(control.contentItem.focus) - } - - Component { - id: intValidatorComponent - IntValidator { - bottom: 0 - top: 255 - } - } - - function test_acceptableInput_QTBUG_94307() { - let items = [ - { text: "A" }, - { text: "2" }, - { text: "3" } - ] - let control = createTemporaryObject(comboBox, testCase, {model: items, editable: true}) - verify(control) - - verify(control.acceptableInput) - compare(control.displayText, "A") - - let acceptableInputSpy = signalSpy.createObject(control, {target: control, signalName: "acceptableInputChanged"}) - verify(acceptableInputSpy.valid) - - let intValidator = intValidatorComponent.createObject(testCase) - verify(intValidator) - - control.validator = intValidator - - compare(acceptableInputSpy.count, 1) - compare(control.displayText, "A") - compare(control.acceptableInput, false) - - control.currentIndex = 1 - - compare(acceptableInputSpy.count, 2) - compare(control.displayText, "2") - compare(control.acceptableInput, true) - } -} |