From dbc2a90b24cd8dcfd58a9f571981e38761a3bf3b Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Wed, 4 Nov 2015 14:25:29 +0100 Subject: Repurpose ExclusiveGroup to ButtonGroup This is another way of solving the naming clash with Qt Quick Controls, and narrows our focus to the types of controls that actually make sense to have in an "exclusive" group; buttons (Android calls them "selection controls"). Change-Id: Icf6efe583fe784c3594de8635be84bbf757a55cd Reviewed-by: J-P Nurmi --- tests/auto/controls/data/tst_buttongroup.qml | 324 +++++++++++++++++++++++ tests/auto/controls/data/tst_exclusivegroup.qml | 326 ------------------------ tests/auto/controls/data/tst_radiobutton.qml | 41 ++- 3 files changed, 352 insertions(+), 339 deletions(-) create mode 100644 tests/auto/controls/data/tst_buttongroup.qml delete mode 100644 tests/auto/controls/data/tst_exclusivegroup.qml (limited to 'tests') diff --git a/tests/auto/controls/data/tst_buttongroup.qml b/tests/auto/controls/data/tst_buttongroup.qml new file mode 100644 index 00000000..b640a868 --- /dev/null +++ b/tests/auto/controls/data/tst_buttongroup.qml @@ -0,0 +1,324 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 Qt.labs.controls 1.0 +import Qt.labs.templates 1.0 as T + +TestCase { + id: testCase + width: 200 + height: 200 + visible: true + when: windowShown + name: "ButtonGroup" + + Component { + id: buttonGroup + ButtonGroup { } + } + + SignalSpy { + id: checkedButtonSpy + signalName: "checkedButtonChanged" + } + + SignalSpy { + id: buttonsSpy + signalName: "buttonsChanged" + } + + function init() { + verify(!checkedButtonSpy.target) + compare(checkedButtonSpy.count, 0) + + verify(!buttonsSpy.target) + compare(buttonsSpy.count, 0) + } + + function cleanup() { + checkedButtonSpy.target = null + checkedButtonSpy.clear() + + buttonsSpy.target = null + buttonsSpy.clear() + } + + function test_null() { + var group = buttonGroup.createObject(testCase) + verify(group) + + group.addButton(null) + group.removeButton(null) + + group.destroy() + } + + Component { + id: button + Button { } + } + + Component { + id: nonCheckable + QtObject { } + } + + function test_current() { + var group = buttonGroup.createObject(testCase) + verify(group) + + checkedButtonSpy.target = group + verify(checkedButtonSpy.valid) + verify(!group.checkedButton) + + var button1 = button.createObject(testCase, {checked: true}) + var button2 = button.createObject(testCase, {checked: false}) + var button3 = button.createObject(testCase, {checked: true, objectName: "3"}) + + // add checked + group.addButton(button1) + compare(group.checkedButton, button1) + compare(button1.checked, true) + compare(button2.checked, false) + compare(button3.checked, true) + compare(checkedButtonSpy.count, 1) + + // add non-checked + group.addButton(button2) + compare(group.checkedButton, button1) + compare(button1.checked, true) + compare(button2.checked, false) + compare(button3.checked, true) + compare(checkedButtonSpy.count, 1) + + // add checked + group.addButton(button3) + compare(group.checkedButton, button3) + compare(button1.checked, false) + compare(button2.checked, false) + compare(button3.checked, true) + compare(checkedButtonSpy.count, 2) + + // change current + group.checkedButton = button2 + compare(group.checkedButton, button2) + compare(button1.checked, false) + compare(button2.checked, true) + compare(button3.checked, false) + compare(checkedButtonSpy.count, 3) + + // check + button1.checked = true + compare(group.checkedButton, button1) + compare(button1.checked, true) + compare(button2.checked, false) + compare(button3.checked, false) + compare(checkedButtonSpy.count, 4) + + // remove non-checked + group.removeButton(button2) + compare(group.checkedButton, button1) + compare(button1.checked, true) + compare(button2.checked, false) + compare(button3.checked, false) + compare(checkedButtonSpy.count, 4) + + // remove checked + group.removeButton(button1) + verify(!group.checkedButton) + compare(button1.checked, false) + compare(button2.checked, false) + compare(button3.checked, false) + compare(checkedButtonSpy.count, 5) + + group.destroy() + } + + function test_buttons() { + var group = buttonGroup.createObject(testCase) + verify(group) + + buttonsSpy.target = group + verify(buttonsSpy.valid) + + compare(group.buttons.length, 0) + compare(group.checkedButton, null) + + var button1 = button.createObject(testCase, {checked: true}) + var button2 = button.createObject(testCase, {checked: false}) + + group.buttons = [button1, button2] + compare(group.buttons.length, 2) + compare(group.buttons[0], button1) + compare(group.buttons[1], button2) + compare(group.checkedButton, button1) + compare(buttonsSpy.count, 2) + + var button3 = button.createObject(testCase, {checked: true}) + + group.addButton(button3) + compare(group.buttons.length, 3) + compare(group.buttons[0], button1) + compare(group.buttons[1], button2) + compare(group.buttons[2], button3) + compare(group.checkedButton, button3) + compare(buttonsSpy.count, 3) + + group.removeButton(button1) + compare(group.buttons.length, 2) + compare(group.buttons[0], button2) + compare(group.buttons[1], button3) + compare(group.checkedButton, button3) + compare(buttonsSpy.count, 4) + + group.buttons = [] + compare(group.buttons.length, 0) + compare(group.checkedButton, null) + compare(buttonsSpy.count, 5) + + group.destroy() + } + + Component { + id: checkBoxes + Item { + property ButtonGroup group: ButtonGroup { id: group } + property CheckBox control1: CheckBox { ButtonGroup.group: group } + property CheckBox control2: CheckBox { ButtonGroup.group: group } + property CheckBox control3: CheckBox { ButtonGroup.group: group } + } + } + + Component { + id: radioButtons + Item { + property ButtonGroup group: ButtonGroup { id: group } + property RadioButton control1: RadioButton { ButtonGroup.group: group } + property RadioButton control2: RadioButton { ButtonGroup.group: group } + property RadioButton control3: RadioButton { ButtonGroup.group: group } + } + } + + Component { + id: switches + Item { + property ButtonGroup group: ButtonGroup { id: group } + property Switch control1: Switch { ButtonGroup.group: group } + property Switch control2: Switch { ButtonGroup.group: group } + property Switch control3: Switch { ButtonGroup.group: group } + } + } + + Component { + id: childControls + Item { + id: container + property ButtonGroup group: ButtonGroup { id: group; buttons: container.children } + property alias control1: control1 + property alias control2: control2 + property alias control3: control3 + CheckBox { id: control1 } + RadioButton { id: control2 } + Switch { id: control3 } + } + } + + function test_controls_data() { + return [ + { tag: "CheckBox", component: checkBoxes }, + { tag: "RadioButton", component: radioButtons }, + { tag: "Switch", component: switches }, + { tag: "Children", component: childControls } + ] + } + + function test_controls(data) { + var container = data.component.createObject(testCase) + verify(container) + + verify(!container.group.checkedButton) + + container.control1.checked = true + compare(container.group.checkedButton, container.control1) + compare(container.control1.checked, true) + compare(container.control2.checked, false) + compare(container.control3.checked, false) + + container.control2.checked = true + compare(container.group.checkedButton, container.control2) + compare(container.control1.checked, false) + compare(container.control2.checked, true) + compare(container.control3.checked, false) + + container.control3.checked = true + compare(container.group.checkedButton, container.control3) + compare(container.control1.checked, false) + compare(container.control2.checked, false) + compare(container.control3.checked, true) + + container.destroy() + } + + function test_buttonDestroyed() { + var group = buttonGroup.createObject(testCase) + verify(group) + + buttonsSpy.target = group + verify(buttonsSpy.valid) + + var button1 = button.createObject(testCase, {objectName: "button1", checked: true}) + + group.addButton(button1) + compare(group.buttons.length, 1) + compare(group.buttons[0], button1) + compare(group.checkedButton, button1) + compare(buttonsSpy.count, 1) + + button1.destroy() + wait(0) + compare(group.buttons.length, 0) + compare(group.checkedButton, null) + compare(buttonsSpy.count, 2) + + group.destroy() + } +} diff --git a/tests/auto/controls/data/tst_exclusivegroup.qml b/tests/auto/controls/data/tst_exclusivegroup.qml deleted file mode 100644 index dcabb6c9..00000000 --- a/tests/auto/controls/data/tst_exclusivegroup.qml +++ /dev/null @@ -1,326 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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 Qt.labs.controls 1.0 - -TestCase { - id: testCase - width: 200 - height: 200 - visible: true - when: windowShown - name: "ExclusiveGroup" - - Component { - id: exclusiveGroup - ExclusiveGroup { } - } - - Component { - id: checkableGroup - ExclusiveGroup { - QtObject { objectName: "non-checkable" } - QtObject { objectName: "checkable1"; property bool checked: false } - QtObject { objectName: "checkable2"; property bool checked: true } - QtObject { objectName: "checkable3"; property bool checked: false } - } - } - - SignalSpy { - id: currentSpy - signalName: "currentChanged" - } - - SignalSpy { - id: checkablesSpy - signalName: "checkablesChanged" - } - - function init() { - verify(!currentSpy.target) - compare(currentSpy.count, 0) - - verify(!checkablesSpy.target) - compare(checkablesSpy.count, 0) - } - - function cleanup() { - currentSpy.target = null - currentSpy.clear() - - checkablesSpy.target = null - checkablesSpy.clear() - } - - function test_null() { - var group = exclusiveGroup.createObject(testCase) - verify(group) - - group.addCheckable(null) - group.removeCheckable(null) - - group.destroy() - } - - Component { - id: checkable - QtObject { property bool checked } - } - - Component { - id: nonCheckable - QtObject { } - } - - function test_current() { - var group = exclusiveGroup.createObject(testCase) - verify(group) - - currentSpy.target = group - verify(currentSpy.valid) - verify(!group.current) - - var checkable1 = checkable.createObject(testCase, {checked: true}) - var checkable2 = checkable.createObject(testCase, {checked: false}) - var checkable3 = checkable.createObject(testCase, {checked: true, objectName: "3"}) - - // add checked - group.addCheckable(checkable1) - compare(group.current, checkable1) - compare(checkable1.checked, true) - compare(checkable2.checked, false) - compare(checkable3.checked, true) - compare(currentSpy.count, 1) - - // add non-checked - group.addCheckable(checkable2) - compare(group.current, checkable1) - compare(checkable1.checked, true) - compare(checkable2.checked, false) - compare(checkable3.checked, true) - compare(currentSpy.count, 1) - - // add checked - group.addCheckable(checkable3) - compare(group.current, checkable3) - compare(checkable1.checked, false) - compare(checkable2.checked, false) - compare(checkable3.checked, true) - compare(currentSpy.count, 2) - - // change current - group.current = checkable2 - compare(group.current, checkable2) - compare(checkable1.checked, false) - compare(checkable2.checked, true) - compare(checkable3.checked, false) - compare(currentSpy.count, 3) - - // check - checkable1.checked = true - compare(group.current, checkable1) - compare(checkable1.checked, true) - compare(checkable2.checked, false) - compare(checkable3.checked, false) - compare(currentSpy.count, 4) - - // remove non-checked - group.removeCheckable(checkable2) - compare(group.current, checkable1) - compare(checkable1.checked, true) - compare(checkable2.checked, false) - compare(checkable3.checked, false) - compare(currentSpy.count, 4) - - // remove checked - group.removeCheckable(checkable1) - verify(!group.current) - compare(checkable1.checked, false) - compare(checkable2.checked, false) - compare(checkable3.checked, false) - compare(currentSpy.count, 5) - - group.destroy() - } - - function test_checkables() { - ignoreWarning(Qt.resolvedUrl("tst_exclusivegroup.qml") + ":60:9: QML ExclusiveGroup: The object has no checkedChanged() or toggled() signal.") - var group = checkableGroup.createObject(testCase) - verify(group) - - checkablesSpy.target = group - verify(checkablesSpy.valid) - - compare(group.checkables.length, 3) - compare(group.checkables[0].objectName, "checkable1") - compare(group.checkables[1].objectName, "checkable2") - compare(group.checkables[2].objectName, "checkable3") - compare(group.current, group.checkables[1]) - - var checkable4 = checkable.createObject(testCase, {checked: true}) - var checkable5 = checkable.createObject(testCase, {checked: false}) - - group.checkables = [checkable4, checkable5] - compare(group.checkables.length, 2) - compare(group.checkables[0], checkable4) - compare(group.checkables[1], checkable5) - compare(group.current, checkable4) - compare(checkablesSpy.count, 3) // clear + 2 * append :/ - - var checkable6 = checkable.createObject(testCase, {checked: true}) - - group.addCheckable(checkable6) - compare(group.checkables.length, 3) - compare(group.checkables[0], checkable4) - compare(group.checkables[1], checkable5) - compare(group.checkables[2], checkable6) - compare(group.current, checkable6) - compare(checkablesSpy.count, 4) - - group.removeCheckable(checkable4) - compare(group.checkables.length, 2) - compare(group.checkables[0], checkable5) - compare(group.checkables[1], checkable6) - compare(group.current, checkable6) - compare(checkablesSpy.count, 5) - - group.checkables = [] - compare(group.checkables.length, 0) - compare(group.current, null) - compare(checkablesSpy.count, 6) - - group.destroy() - } - - function test_isCheckable() { - var group = exclusiveGroup.createObject(testCase) - verify(group) - - var checkable1 = checkable.createObject(testCase) - compare(group.isCheckable(checkable1), true) - - var nonCheckable1 = nonCheckable.createObject(testCase) - compare(group.isCheckable(nonCheckable1), false) - - group.destroy() - } - - Component { - id: checkBoxes - Item { - property ExclusiveGroup group: ExclusiveGroup { id: group } - property CheckBox control1: CheckBox { ExclusiveGroup.group: group } - property CheckBox control2: CheckBox { ExclusiveGroup.group: group } - property CheckBox control3: CheckBox { ExclusiveGroup.group: group } - } - } - - Component { - id: radioButtons - Item { - property ExclusiveGroup group: ExclusiveGroup { id: group } - property RadioButton control1: RadioButton { ExclusiveGroup.group: group } - property RadioButton control2: RadioButton { ExclusiveGroup.group: group } - property RadioButton control3: RadioButton { ExclusiveGroup.group: group } - } - } - - Component { - id: switches - Item { - property ExclusiveGroup group: ExclusiveGroup { id: group } - property Switch control1: Switch { ExclusiveGroup.group: group } - property Switch control2: Switch { ExclusiveGroup.group: group } - property Switch control3: Switch { ExclusiveGroup.group: group } - } - } - - Component { - id: childControls - Item { - id: container - property ExclusiveGroup group: ExclusiveGroup { id: group; checkables: container.children } - property alias control1: control1 - property alias control2: control2 - property alias control3: control3 - CheckBox { id: control1 } - RadioButton { id: control2 } - Switch { id: control3 } - } - } - - function test_controls_data() { - return [ - { tag: "CheckBox", component: checkBoxes }, - { tag: "RadioButton", component: radioButtons }, - { tag: "Switch", component: switches }, - { tag: "Children", component: childControls } - ] - } - - function test_controls(data) { - var container = data.component.createObject(testCase) - verify(container) - - verify(!container.group.current) - - container.control1.checked = true - compare(container.group.current, container.control1) - compare(container.control1.checked, true) - compare(container.control2.checked, false) - compare(container.control3.checked, false) - - container.control2.checked = true - compare(container.group.current, container.control2) - compare(container.control1.checked, false) - compare(container.control2.checked, true) - compare(container.control3.checked, false) - - container.control3.checked = true - compare(container.group.current, container.control3) - compare(container.control1.checked, false) - compare(container.control2.checked, false) - compare(container.control3.checked, true) - - container.destroy() - } -} diff --git a/tests/auto/controls/data/tst_radiobutton.qml b/tests/auto/controls/data/tst_radiobutton.qml index 2df3542d..df6834fe 100644 --- a/tests/auto/controls/data/tst_radiobutton.qml +++ b/tests/auto/controls/data/tst_radiobutton.qml @@ -235,9 +235,13 @@ TestCase { // explicitly grouped buttons are only exclusive with each other, not with // auto-exclusive buttons, and the autoExclusive property is ignored - ExclusiveGroup { id: eg } - RadioButton { ExclusiveGroup.group: eg } - RadioButton { ExclusiveGroup.group: eg; autoExclusive: false } + ButtonGroup { id: eg } + RadioButton { ButtonGroup.group: eg } + RadioButton { ButtonGroup.group: eg; autoExclusive: false } + + ButtonGroup { id: eg2 } + RadioButton { id: rb1; Component.onCompleted: eg2.addButton(rb1) } + RadioButton { id: rb2; Component.onCompleted: eg2.addButton(rb2) } // non-exclusive buttons don't affect the others RadioButton { autoExclusive: false } @@ -247,48 +251,59 @@ TestCase { function test_autoExclusive() { var container = radioButtonGroup.createObject(testCase) - compare(container.children.length, 6) + compare(container.children.length, 8) - var checkStates = [false, false, false, false, false, false] - for (var i = 0; i < 6; ++i) + var checkStates = [false, false, false, false, false, false, false, false] + for (var i = 0; i < 8; ++i) compare(container.children[i].checked, checkStates[i]) container.children[0].checked = true checkStates[0] = true - for (i = 0; i < 6; ++i) + for (i = 0; i < 8; ++i) compare(container.children[i].checked, checkStates[i]) container.children[1].checked = true checkStates[0] = false checkStates[1] = true - for (i = 0; i < 6; ++i) + for (i = 0; i < 8; ++i) compare(container.children[i].checked, checkStates[i]) container.children[2].checked = true checkStates[2] = true - for (i = 0; i < 6; ++i) + for (i = 0; i < 8; ++i) compare(container.children[i].checked, checkStates[i]) container.children[3].checked = true checkStates[2] = false checkStates[3] = true - for (i = 0; i < 6; ++i) + for (i = 0; i < 8; ++i) compare(container.children[i].checked, checkStates[i]) container.children[4].checked = true checkStates[4] = true - for (i = 0; i < 6; ++i) + for (i = 0; i < 8; ++i) compare(container.children[i].checked, checkStates[i]) container.children[5].checked = true + checkStates[4] = false checkStates[5] = true - for (i = 0; i < 6; ++i) + for (i = 0; i < 8; ++i) + compare(container.children[i].checked, checkStates[i]) + + container.children[6].checked = true + checkStates[6] = true + for (i = 0; i < 8; ++i) + compare(container.children[i].checked, checkStates[i]) + + container.children[7].checked = true + checkStates[7] = true + for (i = 0; i < 8; ++i) compare(container.children[i].checked, checkStates[i]) container.children[0].checked = true checkStates[0] = true checkStates[1] = false - for (i = 0; i < 6; ++i) + for (i = 0; i < 8; ++i) compare(container.children[i].checked, checkStates[i]) container.destroy() -- cgit v1.2.3