/****************************************************************************
**
** 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 2.12
import QtTest 1.0
import QtQuick.Controls 2.12
import QtQuick.Templates 2.12 as T

TestCase {
    id: testCase
    width: 400
    height: 400
    visible: true
    when: windowShown
    name: "Popup"

    ApplicationWindow {
        id: applicationWindow
        width: 480
        height: 360
    }

    Component {
        id: popupTemplate
        T.Popup { }
    }

    Component {
        id: popupControl
        Popup { }
    }

    Component {
        id: rect
        Rectangle { }
    }

    Component {
        id: signalSpy
        SignalSpy { }
    }

    function test_padding() {
        var control = createTemporaryObject(popupTemplate, testCase)
        verify(control)

        var paddingSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "paddingChanged"})
        verify(paddingSpy.valid)

        var topPaddingSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "topPaddingChanged"})
        verify(topPaddingSpy.valid)

        var leftPaddingSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "leftPaddingChanged"})
        verify(leftPaddingSpy.valid)

        var rightPaddingSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "rightPaddingChanged"})
        verify(rightPaddingSpy.valid)

        var bottomPaddingSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "bottomPaddingChanged"})
        verify(bottomPaddingSpy.valid)

        var paddingChanges = 0
        var topPaddingChanges = 0
        var leftPaddingChanges = 0
        var rightPaddingChanges = 0
        var bottomPaddingChanges = 0

        compare(control.padding, 0)
        compare(control.topPadding, 0)
        compare(control.leftPadding, 0)
        compare(control.rightPadding, 0)
        compare(control.bottomPadding, 0)
        compare(control.availableWidth, 0)
        compare(control.availableHeight, 0)

        control.width = 100
        control.height = 100

        control.padding = 10
        compare(control.padding, 10)
        compare(control.topPadding, 10)
        compare(control.leftPadding, 10)
        compare(control.rightPadding, 10)
        compare(control.bottomPadding, 10)
        compare(paddingSpy.count, ++paddingChanges)
        compare(topPaddingSpy.count, ++topPaddingChanges)
        compare(leftPaddingSpy.count, ++leftPaddingChanges)
        compare(rightPaddingSpy.count, ++rightPaddingChanges)
        compare(bottomPaddingSpy.count, ++bottomPaddingChanges)

        control.topPadding = 20
        compare(control.padding, 10)
        compare(control.topPadding, 20)
        compare(control.leftPadding, 10)
        compare(control.rightPadding, 10)
        compare(control.bottomPadding, 10)
        compare(paddingSpy.count, paddingChanges)
        compare(topPaddingSpy.count, ++topPaddingChanges)
        compare(leftPaddingSpy.count, leftPaddingChanges)
        compare(rightPaddingSpy.count, rightPaddingChanges)
        compare(bottomPaddingSpy.count, bottomPaddingChanges)

        control.leftPadding = 30
        compare(control.padding, 10)
        compare(control.topPadding, 20)
        compare(control.leftPadding, 30)
        compare(control.rightPadding, 10)
        compare(control.bottomPadding, 10)
        compare(paddingSpy.count, paddingChanges)
        compare(topPaddingSpy.count, topPaddingChanges)
        compare(leftPaddingSpy.count, ++leftPaddingChanges)
        compare(rightPaddingSpy.count, rightPaddingChanges)
        compare(bottomPaddingSpy.count, bottomPaddingChanges)

        control.rightPadding = 40
        compare(control.padding, 10)
        compare(control.topPadding, 20)
        compare(control.leftPadding, 30)
        compare(control.rightPadding, 40)
        compare(control.bottomPadding, 10)
        compare(paddingSpy.count, paddingChanges)
        compare(topPaddingSpy.count, topPaddingChanges)
        compare(leftPaddingSpy.count, leftPaddingChanges)
        compare(rightPaddingSpy.count, ++rightPaddingChanges)
        compare(bottomPaddingSpy.count, bottomPaddingChanges)

        control.bottomPadding = 50
        compare(control.padding, 10)
        compare(control.topPadding, 20)
        compare(control.leftPadding, 30)
        compare(control.rightPadding, 40)
        compare(control.bottomPadding, 50)
        compare(paddingSpy.count, paddingChanges)
        compare(topPaddingSpy.count, topPaddingChanges)
        compare(leftPaddingSpy.count, leftPaddingChanges)
        compare(rightPaddingSpy.count, rightPaddingChanges)
        compare(bottomPaddingSpy.count, ++bottomPaddingChanges)

        control.padding = 60
        compare(control.padding, 60)
        compare(control.topPadding, 20)
        compare(control.leftPadding, 30)
        compare(control.rightPadding, 40)
        compare(control.bottomPadding, 50)
        compare(paddingSpy.count, ++paddingChanges)
        compare(topPaddingSpy.count, topPaddingChanges)
        compare(leftPaddingSpy.count, leftPaddingChanges)
        compare(rightPaddingSpy.count, rightPaddingChanges)
        compare(bottomPaddingSpy.count, bottomPaddingChanges)
    }

    function test_availableSize() {
        var control = createTemporaryObject(popupTemplate, testCase)
        verify(control)

        var availableWidthSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "availableWidthChanged"})
        verify(availableWidthSpy.valid)

        var availableHeightSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "availableHeightChanged"})
        verify(availableHeightSpy.valid)

        var availableWidthChanges = 0
        var availableHeightChanges = 0

        control.width = 100
        compare(control.availableWidth, 100)
        compare(availableWidthSpy.count, ++availableWidthChanges)
        compare(availableHeightSpy.count, availableHeightChanges)

        control.height = 100
        compare(control.availableHeight, 100)
        compare(availableWidthSpy.count, availableWidthChanges)
        compare(availableHeightSpy.count, ++availableHeightChanges)

        control.padding = 10
        compare(control.availableWidth, 80)
        compare(control.availableHeight, 80)
        compare(availableWidthSpy.count, ++availableWidthChanges)
        compare(availableHeightSpy.count, ++availableHeightChanges)

        control.topPadding = 20
        compare(control.availableWidth, 80)
        compare(control.availableHeight, 70)
        compare(availableWidthSpy.count, availableWidthChanges)
        compare(availableHeightSpy.count, ++availableHeightChanges)

        control.leftPadding = 30
        compare(control.availableWidth, 60)
        compare(control.availableHeight, 70)
        compare(availableWidthSpy.count, ++availableWidthChanges)
        compare(availableHeightSpy.count, availableHeightChanges)

        control.rightPadding = 40
        compare(control.availableWidth, 30)
        compare(control.availableHeight, 70)
        compare(availableWidthSpy.count, ++availableWidthChanges)
        compare(availableHeightSpy.count, availableHeightChanges)

        control.bottomPadding = 50
        compare(control.availableWidth, 30)
        compare(control.availableHeight, 30)
        compare(availableWidthSpy.count, availableWidthChanges)
        compare(availableHeightSpy.count, ++availableHeightChanges)

        control.padding = 60
        compare(control.availableWidth, 30)
        compare(control.availableHeight, 30)
        compare(availableWidthSpy.count, availableWidthChanges)
        compare(availableHeightSpy.count, availableHeightChanges)

        control.width = 0
        compare(control.availableWidth, 0)
        compare(availableWidthSpy.count, ++availableWidthChanges)
        compare(availableHeightSpy.count, availableHeightChanges)

        control.height = 0
        compare(control.availableHeight, 0)
        compare(availableWidthSpy.count, availableWidthChanges)
        compare(availableHeightSpy.count, ++availableHeightChanges)
    }

    function test_position() {
        var control = createTemporaryObject(popupControl, testCase, {visible: true, leftMargin: 10, topMargin: 20, width: 100, height: 100})
        verify(control)
        verify(control.visible)

        var xSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "xChanged"})
        verify(xSpy.valid)

        var ySpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "yChanged"})
        verify(ySpy.valid)

        // moving outside margins does not trigger change notifiers
        control.x = -100
        compare(control.x, 10)
        compare(control.y, 20)
        compare(xSpy.count, 0)
        compare(ySpy.count, 0)

        control.y = -200
        compare(control.x, 10)
        compare(control.y, 20)
        compare(xSpy.count, 0)
        compare(ySpy.count, 0)

        // moving within margins triggers change notifiers
        control.x = 30
        compare(control.x, 30)
        compare(control.y, 20)
        compare(xSpy.count, 1)
        compare(ySpy.count, 0)

        control.y = 40
        compare(control.x, 30)
        compare(control.y, 40)
        compare(xSpy.count, 1)
        compare(ySpy.count, 1)

        // re-parent and reset the position
        control.parent = createTemporaryObject(rect, testCase, {color: "red", width: 100, height: 100})
        control.x = 0
        control.y = 0
        compare(xSpy.count, 2)
        compare(ySpy.count, 2)

        // moving parent outside margins triggers change notifiers
        control.parent.x = -50
        compare(control.x, 50 + control.leftMargin)
        compare(xSpy.count, 3)
        compare(ySpy.count, 2)

        control.parent.y = -60
        compare(control.y, 60 + control.topMargin)
        compare(xSpy.count, 3)
        compare(ySpy.count, 3)
    }

    function test_resetSize() {
        var control = createTemporaryObject(popupControl, testCase, {visible: true, margins: 0})
        verify(control)

        control.scale = 1.0
        control.width = control.implicitWidth = testCase.width + 10
        control.height = control.implicitHeight = testCase.height + 10

        compare(control.width, testCase.width + 10)
        compare(control.height, testCase.height + 10)

        control.width = undefined
        control.height = undefined
        compare(control.width, testCase.width)
        compare(control.height, testCase.height)
    }

    function test_negativeMargins() {
        var control = createTemporaryObject(popupControl, testCase, {implicitWidth: testCase.width, implicitHeight: testCase.height})
        verify(control)

        control.open()
        verify(control.visible)

        compare(control.x, 0)
        compare(control.y, 0)

        compare(control.margins, -1)
        compare(control.topMargin, -1)
        compare(control.leftMargin, -1)
        compare(control.rightMargin, -1)
        compare(control.bottomMargin, -1)

        control.x = -10
        control.y = -10
        compare(control.x, 0)
        compare(control.y, 0)
    }

    function test_margins() {
        var control = createTemporaryObject(popupTemplate, testCase, {width: 100, height: 100})
        verify(control)

        control.open()
        verify(control.visible)

        control.margins = 10
        compare(control.margins, 10)
        compare(control.topMargin, 10)
        compare(control.leftMargin, 10)
        compare(control.rightMargin, 10)
        compare(control.bottomMargin, 10)
        compare(control.contentItem.parent.x, 10)
        compare(control.contentItem.parent.y, 10)

        control.topMargin = 20
        compare(control.margins, 10)
        compare(control.topMargin, 20)
        compare(control.leftMargin, 10)
        compare(control.rightMargin, 10)
        compare(control.bottomMargin, 10)
        compare(control.contentItem.parent.x, 10)
        compare(control.contentItem.parent.y, 20)

        control.leftMargin = 20
        compare(control.margins, 10)
        compare(control.topMargin, 20)
        compare(control.leftMargin, 20)
        compare(control.rightMargin, 10)
        compare(control.bottomMargin, 10)
        compare(control.contentItem.parent.x, 20)
        compare(control.contentItem.parent.y, 20)

        control.x = testCase.width
        control.y = testCase.height
        compare(control.contentItem.parent.x, testCase.width - control.width - 10)
        compare(control.contentItem.parent.y, testCase.height - control.height - 10)

        control.rightMargin = 20
        compare(control.margins, 10)
        compare(control.topMargin, 20)
        compare(control.leftMargin, 20)
        compare(control.rightMargin, 20)
        compare(control.bottomMargin, 10)
        compare(control.contentItem.parent.x, testCase.width - control.width - 20)
        compare(control.contentItem.parent.y, testCase.height - control.height - 10)

        control.bottomMargin = 20
        compare(control.margins, 10)
        compare(control.topMargin, 20)
        compare(control.leftMargin, 20)
        compare(control.rightMargin, 20)
        compare(control.bottomMargin, 20)
        compare(control.contentItem.parent.x, testCase.width - control.width - 20)
        compare(control.contentItem.parent.y, testCase.height - control.height - 20)

        control.margins = undefined
        compare(control.margins, -1)

        control.bottomMargin = undefined
        compare(control.bottomMargin, -1)
        compare(control.contentItem.parent.x, testCase.width - control.width - 20)
        compare(control.contentItem.parent.y, testCase.height)

        control.rightMargin = undefined
        compare(control.rightMargin, -1)
        compare(control.contentItem.parent.x, testCase.width)
        compare(control.contentItem.parent.y, testCase.height)

        control.x = -testCase.width
        control.y = -testCase.height
        compare(control.contentItem.parent.x, 20)
        compare(control.contentItem.parent.y, 20)

        control.topMargin = undefined
        compare(control.topMargin, -1)
        compare(control.contentItem.parent.x, 20)
        compare(control.contentItem.parent.y, -testCase.height)

        control.leftMargin = undefined
        compare(control.leftMargin, -1)
        compare(control.contentItem.parent.x, -testCase.width)
        compare(control.contentItem.parent.y, -testCase.height)
    }

    function test_background() {
        var control = createTemporaryObject(popupTemplate, testCase)
        verify(control)

        control.background = rect.createObject(testCase)

        // background has no x or width set, so its width follows control's width
        control.width = 320
        compare(control.background.width, control.width)

        // background has no y or height set, so its height follows control's height
        compare(control.background.height, control.height)
        control.height = 240

        // has width => width does not follow
        control.background.width /= 2
        control.width += 20
        verify(control.background.width !== control.width)

        // reset width => width follows again
        control.background.width = undefined
        control.width += 20
        compare(control.background.width, control.width)

        // has x => width does not follow
        control.background.x = 10
        control.width += 20
        verify(control.background.width !== control.width)

        // has height => height does not follow
        control.background.height /= 2
        control.height -= 20
        verify(control.background.height !== control.height)

        // reset height => height follows again
        control.background.height = undefined
        control.height -= 20
        compare(control.background.height, control.height)

        // has y => height does not follow
        control.background.y = 10
        control.height -= 20
        verify(control.background.height !== control.height)
    }

    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
    }

    Component {
        id: component
        ApplicationWindow {
            id: _window
            width: 400
            height: 400
            visible: true
            font.pixelSize: 40
            property alias pane: _pane
            property alias popup: _popup
            property SignalSpy fontspy: SignalSpy { target: _window; signalName: "fontChanged" }
            Pane {
                id: _pane
                property alias button: _button
                font.pixelSize: 30
                property SignalSpy fontspy: SignalSpy { target: _pane; signalName: "fontChanged" }
                Column {
                    Button {
                        id: _button
                        text: "Button"
                        font.pixelSize: 20
                        property SignalSpy fontspy: SignalSpy { target: _button; signalName: "fontChanged" }
                        Popup {
                            id: _popup
                            property alias button: _button2
                            property alias listview: _listview
                            y: _button.height
                            implicitHeight: Math.min(396, _listview.contentHeight)
                            property SignalSpy fontspy: SignalSpy { target: _popup; signalName: "fontChanged" }
                            contentItem: Column {
                                Button {
                                    id: _button2
                                    text: "Button"
                                    property SignalSpy fontspy: SignalSpy { target: _button2; signalName: "fontChanged" }
                                }
                                ListView {
                                    id: _listview
                                    height: _button.height * 20
                                    model: 2
                                    delegate: Button {
                                        id: _button3
                                        objectName: "delegate"
                                        width: _button.width
                                        height: _button.height
                                        text: "N: " + index
                                        checkable: true
                                        autoExclusive: true
                                        property SignalSpy fontspy: SignalSpy { target: _button3; signalName: "fontChanged" }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    function test_font() { // QTBUG_50984, QTBUG-51696
        var window = createTemporaryObject(component, testCase)
        verify(window)

        compare(window.font.pixelSize, 40)
        compare(window.pane.font.pixelSize, 30)
        compare(window.pane.button.font.pixelSize, 20)
        compare(window.popup.font.pixelSize, 40)
        compare(window.popup.button.font.pixelSize, 40)

        var idx1 = getChild(window.popup.listview.contentItem, "delegate", -1)
        compare(window.popup.listview.contentItem.children[idx1].font.pixelSize, 40)
        var idx2 = getChild(window.popup.listview.contentItem, "delegate", idx1)
        compare(window.popup.listview.contentItem.children[idx2].font.pixelSize, 40)

        window.pane.button.font.pixelSize = 30
        compare(window.font.pixelSize, 40)
        compare(window.fontspy.count, 0)
        compare(window.pane.font.pixelSize, 30)
        compare(window.pane.fontspy.count, 0)
        compare(window.pane.button.font.pixelSize, 30)
        compare(window.pane.button.fontspy.count, 1)
        compare(window.popup.font.pixelSize, 40)
        compare(window.popup.fontspy.count, 0)
        compare(window.popup.button.font.pixelSize, 40)
        compare(window.popup.button.fontspy.count, 0)
        compare(window.popup.listview.contentItem.children[idx1].font.pixelSize, 40)
        compare(window.popup.listview.contentItem.children[idx1].fontspy.count, 0)
        compare(window.popup.listview.contentItem.children[idx2].font.pixelSize, 40)
        compare(window.popup.listview.contentItem.children[idx2].fontspy.count, 0)

        window.font.pixelSize = 50
        compare(window.font.pixelSize, 50)
        compare(window.fontspy.count, 1)
        compare(window.pane.font.pixelSize, 30)
        compare(window.pane.fontspy.count, 0)
        compare(window.pane.button.font.pixelSize, 30)
        compare(window.pane.button.fontspy.count, 1)
        compare(window.popup.font.pixelSize, 50)
        compare(window.popup.fontspy.count, 1)
        compare(window.popup.button.font.pixelSize, 50)
        compare(window.popup.button.fontspy.count, 1)
        compare(window.popup.listview.contentItem.children[idx1].font.pixelSize, 50)
        compare(window.popup.listview.contentItem.children[idx1].fontspy.count, 1)
        compare(window.popup.listview.contentItem.children[idx2].font.pixelSize, 50)
        compare(window.popup.listview.contentItem.children[idx2].fontspy.count, 1)

        window.popup.button.font.pixelSize = 10
        compare(window.font.pixelSize, 50)
        compare(window.fontspy.count, 1)
        compare(window.pane.font.pixelSize, 30)
        compare(window.pane.fontspy.count, 0)
        compare(window.pane.button.font.pixelSize, 30)
        compare(window.pane.button.fontspy.count, 1)
        compare(window.popup.font.pixelSize, 50)
        compare(window.popup.fontspy.count, 1)
        compare(window.popup.button.font.pixelSize, 10)
        compare(window.popup.button.fontspy.count, 2)
        compare(window.popup.listview.contentItem.children[idx1].font.pixelSize, 50)
        compare(window.popup.listview.contentItem.children[idx1].fontspy.count, 1)
        compare(window.popup.listview.contentItem.children[idx2].font.pixelSize, 50)
        compare(window.popup.listview.contentItem.children[idx2].fontspy.count, 1)

        window.popup.font.pixelSize = 60
        compare(window.font.pixelSize, 50)
        compare(window.fontspy.count, 1)
        compare(window.pane.font.pixelSize, 30)
        compare(window.pane.fontspy.count, 0)
        compare(window.pane.button.font.pixelSize, 30)
        compare(window.pane.button.fontspy.count, 1)
        compare(window.popup.font.pixelSize, 60)
        compare(window.popup.fontspy.count, 2)
        compare(window.popup.button.font.pixelSize, 10)
        compare(window.popup.button.fontspy.count, 2)
        compare(window.popup.listview.contentItem.children[idx1].font.pixelSize, 60)
        compare(window.popup.listview.contentItem.children[idx1].fontspy.count, 2)
        compare(window.popup.listview.contentItem.children[idx2].font.pixelSize, 60)
        compare(window.popup.listview.contentItem.children[idx2].fontspy.count, 2)
    }

    Component {
        id: localeComponent
        Pane {
            property alias button: _button
            property alias popup: _popup
            locale: Qt.locale("en_US")
            Column {
                Button {
                    id: _button
                    text: "Button"
                    locale: Qt.locale("nb_NO")
                    Popup {
                        id: _popup
                        property alias button1: _button1
                        property alias button2: _button2
                        y: _button.height
                        locale: Qt.locale("fi_FI")
                        implicitHeight: Math.min(396, _column.contentHeight)
                        contentItem: Column {
                            id: _column
                            Button {
                                id: _button1
                                text: "Button 1"
                                objectName: "1"
                            }
                            Button {
                                id: _button2
                                text: "Button 2"
                                locale: Qt.locale("nb_NO")
                                objectName: "2"
                            }
                        }
                    }
                }
            }
        }
    }

    function test_locale() { // QTBUG_50984
        // test looking up natural locale from ancestors
        var control = createTemporaryObject(localeComponent, applicationWindow.contentItem)
        verify(control)

        compare(control.locale.name, "en_US")
        compare(control.button.locale.name, "nb_NO")
        compare(control.popup.locale.name, "fi_FI")
        compare(control.popup.button1.locale.name, "fi_FI")
        compare(control.popup.button2.locale.name, "nb_NO")

        control.ApplicationWindow.window.locale = undefined
    }

    Component {
        id: localeChangeComponent
        Pane {
            id: _pane
            property alias button: _button
            property alias popup: _popup
            property SignalSpy localespy: SignalSpy {
                target: _pane
                signalName: "localeChanged"
            }
            property SignalSpy mirrorspy: SignalSpy {
                target: _pane
                signalName: "mirroredChanged"
            }
            Column {
                Button {
                    id: _button
                    text: "Button"
                    property SignalSpy localespy: SignalSpy {
                        target: _button
                        signalName: "localeChanged"
                    }
                    property SignalSpy mirrorspy: SignalSpy {
                        target: _button
                        signalName: "mirroredChanged"
                    }
                    Popup {
                        id: _popup
                        property alias button1: _button1
                        property alias button2: _button2
                        y: _button.height
                        implicitHeight: Math.min(396, _column.contentHeight)
                        property SignalSpy localespy: SignalSpy {
                            target: _popup
                            signalName: "localeChanged"
                        }
                        contentItem: Column {
                            id: _column
                            Button {
                                id: _button1
                                text: "Button 1"
                                property SignalSpy localespy: SignalSpy {
                                    target: _button1
                                    signalName: "localeChanged"
                                }
                                property SignalSpy mirrorspy: SignalSpy {
                                    target: _button1
                                    signalName: "mirroredChanged"
                                }
                            }
                            Button {
                                id: _button2
                                text: "Button 2"
                                property SignalSpy localespy: SignalSpy {
                                    target: _button2
                                    signalName: "localeChanged"
                                }
                                property SignalSpy mirrorspy: SignalSpy {
                                    target: _button2
                                    signalName: "mirroredChanged"
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    function test_locale_changes() { // QTBUG_50984
        // test default locale and locale inheritance
        var control = createTemporaryObject(localeChangeComponent, applicationWindow.contentItem)
        verify(control)

        var defaultLocale = Qt.locale()
        compare(control.ApplicationWindow.window.locale.name, defaultLocale.name)
        compare(control.locale.name, defaultLocale.name)
        compare(control.button.locale.name, defaultLocale.name)
        compare(control.popup.locale.name, defaultLocale.name)
        compare(control.popup.button1.locale.name, defaultLocale.name)
        compare(control.popup.button2.locale.name, defaultLocale.name)

        control.ApplicationWindow.window.locale = Qt.locale("nb_NO")
        compare(control.ApplicationWindow.window.locale.name, "nb_NO")
        compare(control.locale.name, "nb_NO")
        compare(control.button.locale.name, "nb_NO")
        compare(control.popup.locale.name, "nb_NO")
        compare(control.popup.button1.locale.name, "nb_NO")
        compare(control.popup.button2.locale.name, "nb_NO")
        compare(control.localespy.count, 1)
        compare(control.button.localespy.count, 1)
        compare(control.popup.localespy.count, 1)
        compare(control.popup.button1.localespy.count, 1)
        compare(control.popup.button2.localespy.count, 1)

        control.ApplicationWindow.window.locale = undefined
        compare(control.ApplicationWindow.window.locale.name, defaultLocale.name)
        compare(control.locale.name, defaultLocale.name)
        compare(control.button.locale.name, defaultLocale.name)
        compare(control.popup.locale.name, defaultLocale.name)
        compare(control.popup.button1.locale.name, defaultLocale.name)
        compare(control.popup.button2.locale.name, defaultLocale.name)
        compare(control.localespy.count, 2)
        compare(control.button.localespy.count, 2)
        compare(control.popup.localespy.count, 2)
        compare(control.popup.button1.localespy.count, 2)
        compare(control.popup.button2.localespy.count, 2)

        control.locale = Qt.locale("ar_EG")
        compare(control.ApplicationWindow.window.locale.name, defaultLocale.name)
        compare(control.locale.name, "ar_EG")
        compare(control.button.locale.name, "ar_EG")
        compare(control.popup.locale.name, defaultLocale.name)
        compare(control.popup.button1.locale.name, defaultLocale.name)
        compare(control.popup.button2.locale.name, defaultLocale.name)
        compare(control.localespy.count, 3)
        compare(control.mirrorspy.count, 1)
        compare(control.button.localespy.count, 3)
        compare(control.button.mirrorspy.count, 1)
        compare(control.popup.localespy.count, 2)
        compare(control.popup.button1.localespy.count, 2)
        compare(control.popup.button2.localespy.count, 2)

        control.ApplicationWindow.window.locale = Qt.locale("ar_EG")
        compare(control.ApplicationWindow.window.locale.name, "ar_EG")
        compare(control.locale.name, "ar_EG")
        compare(control.button.locale.name, "ar_EG")
        compare(control.popup.locale.name, "ar_EG")
        compare(control.popup.button1.locale.name, "ar_EG")
        compare(control.popup.button2.locale.name, "ar_EG")
        compare(control.localespy.count, 3)
        compare(control.mirrorspy.count, 1)
        compare(control.button.localespy.count, 3)
        compare(control.button.mirrorspy.count, 1)
        compare(control.popup.localespy.count, 3)
        compare(control.popup.button1.localespy.count, 3)
        compare(control.popup.button1.mirrorspy.count, 1)
        compare(control.popup.button2.localespy.count, 3)
        compare(control.popup.button2.mirrorspy.count, 1)

        control.button.locale = Qt.locale("nb_NO")
        compare(control.ApplicationWindow.window.locale.name, "ar_EG")
        compare(control.locale.name, "ar_EG")
        compare(control.button.locale.name, "nb_NO")
        compare(control.popup.locale.name, "ar_EG")
        compare(control.popup.button1.locale.name, "ar_EG")
        compare(control.popup.button2.locale.name, "ar_EG")
        compare(control.localespy.count, 3)
        compare(control.mirrorspy.count, 1)
        compare(control.button.localespy.count, 4)
        compare(control.button.mirrorspy.count, 2)
        compare(control.popup.localespy.count, 3)
        compare(control.popup.button1.localespy.count, 3)
        compare(control.popup.button2.localespy.count, 3)

        control.locale = undefined
        compare(control.ApplicationWindow.window.locale.name, "ar_EG")
        compare(control.locale.name, "ar_EG")
        compare(control.button.locale.name, "nb_NO")
        compare(control.popup.locale.name, "ar_EG")
        compare(control.popup.button1.locale.name, "ar_EG")
        compare(control.popup.button2.locale.name, "ar_EG")
        compare(control.localespy.count, 3)
        compare(control.mirrorspy.count, 1)
        compare(control.button.localespy.count, 4)
        compare(control.button.mirrorspy.count, 2)
        compare(control.popup.localespy.count, 3)
        compare(control.popup.button1.localespy.count, 3)
        compare(control.popup.button2.localespy.count, 3)

        control.popup.button1.locale = Qt.locale("nb_NO")
        compare(control.ApplicationWindow.window.locale.name, "ar_EG")
        compare(control.locale.name, "ar_EG")
        compare(control.button.locale.name, "nb_NO")
        compare(control.popup.locale.name, "ar_EG")
        compare(control.popup.button1.locale.name, "nb_NO")
        compare(control.popup.button2.locale.name, "ar_EG")
        compare(control.localespy.count, 3)
        compare(control.mirrorspy.count, 1)
        compare(control.button.localespy.count, 4)
        compare(control.button.mirrorspy.count, 2)
        compare(control.popup.localespy.count, 3)
        compare(control.popup.button1.localespy.count, 4)
        compare(control.popup.button1.mirrorspy.count, 2)
        compare(control.popup.button2.localespy.count, 3)
        compare(control.popup.button2.mirrorspy.count, 1)

        control.popup.locale = Qt.locale("fi_FI")
        compare(control.ApplicationWindow.window.locale.name, "ar_EG")
        compare(control.locale.name, "ar_EG")
        compare(control.button.locale.name, "nb_NO")
        compare(control.popup.locale.name, "fi_FI")
        compare(control.popup.button1.locale.name, "nb_NO")
        compare(control.popup.button2.locale.name, "fi_FI")
        compare(control.localespy.count, 3)
        compare(control.mirrorspy.count, 1)
        compare(control.button.localespy.count, 4)
        compare(control.button.mirrorspy.count, 2)
        compare(control.popup.localespy.count, 4)
        compare(control.popup.button1.localespy.count, 4)
        compare(control.popup.button1.mirrorspy.count, 2)
        compare(control.popup.button2.localespy.count, 4)
        compare(control.popup.button2.mirrorspy.count, 2)

        control.ApplicationWindow.window.locale = undefined
        compare(control.ApplicationWindow.window.locale.name, defaultLocale.name)
        compare(control.locale.name, defaultLocale.name)
        compare(control.button.locale.name, "nb_NO")
        compare(control.popup.locale.name, "fi_FI")
        compare(control.popup.button1.locale.name, "nb_NO")
        compare(control.popup.button2.locale.name, "fi_FI")
        compare(control.localespy.count, 4)
        compare(control.mirrorspy.count, 2)
        compare(control.button.localespy.count, 4)
        compare(control.button.mirrorspy.count, 2)
        compare(control.popup.localespy.count, 4)
        compare(control.popup.button1.localespy.count, 4)
        compare(control.popup.button1.mirrorspy.count, 2)
        compare(control.popup.button2.localespy.count, 4)
        compare(control.popup.button2.mirrorspy.count, 2)

        control.popup.locale = undefined
        compare(control.ApplicationWindow.window.locale.name, defaultLocale.name)
        compare(control.locale.name, defaultLocale.name)
        compare(control.button.locale.name, "nb_NO")
        compare(control.popup.locale.name, defaultLocale.name)
        compare(control.popup.button1.locale.name, "nb_NO")
        compare(control.popup.button2.locale.name, defaultLocale.name)
        compare(control.localespy.count, 4)
        compare(control.mirrorspy.count, 2)
        compare(control.button.localespy.count, 4)
        compare(control.button.mirrorspy.count, 2)
        compare(control.popup.localespy.count, 5)
        compare(control.popup.button1.localespy.count, 4)
        compare(control.popup.button1.mirrorspy.count, 2)
        compare(control.popup.button2.localespy.count, 5)
        compare(control.popup.button2.mirrorspy.count, 2)
    }

    function test_size() {
        var control = createTemporaryObject(popupControl, testCase)
        verify(control)

        var openedSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "opened"})
        verify(openedSpy.valid)

        control.open()
        openedSpy.wait()
        compare(openedSpy.count, 1)
        verify(control.visible)

        // remove the background so that it won't affect the implicit size of the popup,
        // so the implicit sizes tested below are entirely based on the content size
        control.background = null

        // implicit size of the content
        control.contentItem.implicitWidth = 10
        compare(control.implicitWidth, 10 + control.leftPadding + control.rightPadding)
        compare(control.width, control.implicitWidth)
        compare(control.contentItem.width, control.width - control.leftPadding - control.rightPadding)

        control.contentItem.implicitHeight = 20
        compare(control.implicitHeight, 20 + control.topPadding + control.bottomPadding)
        compare(control.height, control.implicitHeight)
        compare(control.contentItem.height, control.height - control.topPadding - control.bottomPadding)

        // implicit size of the popup
        control.implicitWidth = 30
        compare(control.implicitWidth, 30)
        compare(control.width, 30)
        compare(control.contentItem.width, control.width - control.leftPadding - control.rightPadding)

        control.implicitHeight = 40
        compare(control.implicitHeight, 40)
        compare(control.height, 40)
        compare(control.contentItem.height, control.height - control.topPadding - control.bottomPadding)

        // set explicit size
        control.width = 50
        compare(control.implicitWidth, 30)
        compare(control.width, 50)
        compare(control.contentItem.width, control.width - control.leftPadding - control.rightPadding)

        control.height = 60
        compare(control.implicitHeight, 40)
        compare(control.height, 60)
        compare(control.contentItem.height, control.height - control.topPadding - control.bottomPadding)

        // reset explicit size
        control.width = undefined
        compare(control.implicitWidth, 30)
        compare(control.width, 30)
        compare(control.contentItem.width, control.width - control.leftPadding - control.rightPadding)

        control.height = undefined
        compare(control.implicitHeight, 40)
        compare(control.height, 40)
        compare(control.contentItem.height, control.height - control.topPadding - control.bottomPadding)
    }

    function test_visible() {
        var control = createTemporaryObject(popupTemplate, testCase, {visible: true})
        verify(control)

        // QTBUG-51989
        tryCompare(control, "visible", true)

        // QTBUG-55347
        control.parent = null
        verify(!control.visible)
    }

    Component {
        id: overlayTest
        ApplicationWindow {
            property alias firstDrawer: firstDrawer
            property alias secondDrawer: secondDrawer
            property alias modalPopup: modalPopup
            property alias modelessPopup: modelessPopup
            property alias plainPopup: plainPopup
            property alias modalPopupWithoutDim: modalPopupWithoutDim
            visible: true
            Drawer {
                z: 0
                id: firstDrawer
            }
            Drawer {
                z: 1
                id: secondDrawer
            }
            Popup {
                id: modalPopup
                z: 2
                modal: true
                exit: Transition { PauseAnimation { duration: 200 } }
            }
            Popup {
                id: modelessPopup
                z: 3
                dim: true
                exit: Transition { PauseAnimation { duration: 200 } }
            }
            Popup {
                id: plainPopup
                z: 4
                enter: Transition { PauseAnimation { duration: 200 } }
                exit: Transition { PauseAnimation { duration: 200 } }
            }
            Popup {
                id: modalPopupWithoutDim
                z: 5
                dim: false
                modal: true
                exit: Transition { PauseAnimation { duration: 200 } }
            }
        }
    }

    function indexOf(array, item) {
        for (var idx = 0; idx < array.length; ++idx) {
            if (item === array[idx])
                return idx;
        }
        return -1
    }

    function findOverlay(window, popup) {
        var item = popup.contentItem.parent
        var idx = indexOf(window.overlay.children, item)
        return window.overlay.children[idx - 1]
    }

    function test_overlay() {
        var window = createTemporaryObject(overlayTest, testCase)
        verify(window)

        window.requestActivate()
        tryCompare(window, "active", true)

        compare(window.overlay.children.length, 0)
        compare(window.overlay, window.Overlay.overlay)

        var firstOverlay = findOverlay(window, window.firstDrawer)
        verify(!firstOverlay)
        window.firstDrawer.open()
        compare(window.overlay.children.length, 2) // 1 drawer + 1 overlay
        firstOverlay = findOverlay(window, window.firstDrawer)
        verify(firstOverlay)
        compare(firstOverlay.z, window.firstDrawer.z)
        compare(indexOf(window.overlay.children, firstOverlay),
                indexOf(window.overlay.children, window.firstDrawer.contentItem.parent) - 1)
        tryCompare(firstOverlay, "opacity", 1.0)

        var secondOverlay = findOverlay(window, window.secondDrawer)
        verify(!secondOverlay)
        window.secondDrawer.open()
        compare(window.overlay.children.length, 4) // 2 drawers + 2 overlays
        secondOverlay = findOverlay(window, window.secondDrawer)
        verify(secondOverlay)
        compare(secondOverlay.z, window.secondDrawer.z)
        compare(indexOf(window.overlay.children, secondOverlay),
                indexOf(window.overlay.children, window.secondDrawer.contentItem.parent) - 1)
        tryCompare(secondOverlay, "opacity", 1.0)

        window.firstDrawer.close()
        tryCompare(window.firstDrawer, "visible", false)
        firstOverlay = findOverlay(window, window.firstDrawer)
        verify(!firstOverlay)
        compare(window.overlay.children.length, 2) // 1 drawer + 1 overlay

        window.secondDrawer.close()
        tryCompare(window.secondDrawer, "visible", false)
        secondOverlay = findOverlay(window, window.secondDrawer)
        verify(!secondOverlay)
        compare(window.overlay.children.length, 0)

        var modalOverlay = findOverlay(window, window.modalPopup)
        verify(!modalOverlay)
        window.modalPopup.open()
        modalOverlay = findOverlay(window, window.modalPopup)
        verify(modalOverlay)
        compare(modalOverlay.z, window.modalPopup.z)
        compare(window.modalPopup.visible, true)
        tryCompare(modalOverlay, "opacity", 1.0)
        compare(window.overlay.children.length, 2) // 1 popup + 1 overlay

        var modelessOverlay = findOverlay(window, window.modelessPopup)
        verify(!modelessOverlay)
        window.modelessPopup.open()
        modelessOverlay = findOverlay(window, window.modelessPopup)
        verify(modelessOverlay)
        compare(modelessOverlay.z, window.modelessPopup.z)
        compare(window.modelessPopup.visible, true)
        tryCompare(modelessOverlay, "opacity", 1.0)
        compare(window.overlay.children.length, 4) // 2 popups + 2 overlays

        window.modelessPopup.close()
        tryCompare(window.modelessPopup, "visible", false)
        modelessOverlay = findOverlay(window, window.modelessPopup)
        verify(!modelessOverlay)
        compare(window.overlay.children.length, 2) // 1 popup + 1 overlay

        compare(window.modalPopup.visible, true)
        compare(modalOverlay.opacity, 1.0)

        window.modalPopup.close()
        tryCompare(window.modalPopup, "visible", false)
        modalOverlay = findOverlay(window, window.modalPopup)
        verify(!modalOverlay)
        compare(window.overlay.children.length, 0)

        window.plainPopup.open()
        tryCompare(window.plainPopup, "visible", true)
        compare(window.overlay.children.length, 1) // only popup added, no overlays involved

        window.plainPopup.modal = true
        compare(window.overlay.children.length, 2) // overlay added

        window.plainPopup.close()
        tryCompare(window.plainPopup, "visible", false)
        compare(window.overlay.children.length, 0) // popup + overlay removed

        window.modalPopupWithoutDim.open()
        tryCompare(window.modalPopupWithoutDim, "visible", true)
        compare(window.overlay.children.length, 1) // only popup added, no overlays involved

        window.modalPopupWithoutDim.dim = true
        compare(window.overlay.children.length, 2) // overlay added

        window.modalPopupWithoutDim.close()
        tryCompare(window.modalPopupWithoutDim, "visible", false)
        compare(window.overlay.children.length, 0) // popup + overlay removed
    }

    function test_attached_applicationwindow() {
        var control = createTemporaryObject(popupControl, applicationWindow.contentItem)
        verify(control)

        var child = rect.createObject(control.contentItem)

        compare(control.ApplicationWindow.window, applicationWindow)
        compare(control.contentItem.ApplicationWindow.window, applicationWindow)
        compare(child.ApplicationWindow.window, applicationWindow)

        control.parent = null
        compare(control.ApplicationWindow.window, null)
        compare(control.contentItem.ApplicationWindow.window, null)
        compare(child.ApplicationWindow.window, null)
    }

    Component {
        id: pausePopup
        Popup {
            enter: Transition { PauseAnimation { duration: 200 } }
            exit: Transition { PauseAnimation { duration: 200 } }
        }
    }

    function test_openedClosed() {
        var control = createTemporaryObject(pausePopup, testCase)
        verify(control)

        var openedSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "opened"})
        verify(openedSpy.valid)
        var closedSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "closed"})
        verify(closedSpy.valid)
        var openedChangeSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "openedChanged"})
        verify(openedChangeSpy.valid)

        control.open()
        compare(control.visible, true)
        compare(control.opened, false)
        compare(openedChangeSpy.count, 0)
        compare(openedSpy.count, 0)
        tryCompare(openedSpy, "count", 1)
        compare(control.opened, true)
        compare(openedChangeSpy.count, 1)
        compare(closedSpy.count, 0)

        control.close()
        compare(control.visible, true)
        compare(control.opened, false)
        compare(openedChangeSpy.count, 2)
        compare(openedSpy.count, 1)
        compare(closedSpy.count, 0)
        tryCompare(closedSpy, "count", 1)
        compare(control.opened, false)
        compare(openedChangeSpy.count, 2)
        compare(control.visible, false)
    }

    Component {
        id: xyBindingLoop
        ApplicationWindow {
            id: window
            width: 360
            height: 360
            visible: true
            property alias popup: popup

            Popup {
                id: popup
                visible: true
                x: (parent.width - width) / 2
                y: (parent.height - height) / 2
                Label {
                    text: "Content"
                    anchors.fill: parent
                }
            }
        }
    }

    function test_xyBindingLoop() {
        var window = createTemporaryObject(xyBindingLoop, testCase)
        var control = window.popup
        waitForRendering(control.contentItem)
        compare(control.x, (control.parent.width - control.width) / 2)
        compare(control.y, (control.parent.height - control.height) / 2)
    }

    function test_windowParent() {
        var control = createTemporaryObject(popupControl, applicationWindow, {width: 100, height: 100})
        verify(control)

        control.open()
        verify(control.visible)
    }

    function test_deferredBackgroundSize() {
        var control = createTemporaryObject(popupControl, testCase, {width: 200, height: 100})
        verify(control)

        compare(control.background.width, 200 + (control.background.leftInset || 0) + (control.background.rightInset || 0))
        compare(control.background.height, 100 + (control.background.topInset || 0) + (control.background.bottomInset || 0))
    }

    function test_anchors() {
        var control = createTemporaryObject(popupControl, applicationWindow.contentItem.Overlay.overlay,
            { visible: true, width: 100, height: 100 })
        verify(control)
        verify(control.visible)
        // If there is a transition then make sure it is finished
        if (control.enter !== null)
            tryCompare(control.enter, "running", false)
        compare(control.parent, control.Overlay.overlay)
        compare(control.x, 0)
        compare(control.y, 0)

        var overlay = control.Overlay.overlay
        verify(overlay)

        var centerInSpy = createTemporaryObject(signalSpy, testCase, { target: control.anchors, signalName: "centerInChanged" })
        verify(centerInSpy.valid)

        applicationWindow.visible = true
        verify(waitForRendering(applicationWindow.contentItem))
        verify(overlay.width > 0)
        verify(overlay.height > 0)

        // Center the popup in the window via the overlay.
        control.anchors.centerIn = Qt.binding(function() { return control.parent; })
        compare(centerInSpy.count, 1)
        compare(control.x, (overlay.width - (control.width * control.scale)) / 2)
        compare(control.y, (overlay.height - (control.width * control.scale)) / 2)

        // Ensure that it warns when trying to set it to an item that's not its parent.
        var anotherItem = createTemporaryObject(rect, applicationWindow.contentItem, { x: 100, y: 100, width: 50, height: 50 })
        verify(anotherItem)

        ignoreWarning(Qt.resolvedUrl("tst_popup.qml") + ":77:9: QML Popup: Popup can only be centered within its immediate parent or Overlay.overlay")
        control.anchors.centerIn = anotherItem
        // The property will change, because we can't be sure that the parent
        // in QQuickPopupAnchors::setCenterIn() is the final parent, as some reparenting can happen.
        // We still expect the warning from QQuickPopupPositioner::reposition() though.
        compare(centerInSpy.count, 2)
        compare(control.anchors.centerIn, anotherItem)

        // The binding to the popup's parent was broken above, so restore it.
        control.anchors.centerIn = Qt.binding(function() { return control.parent; })
        compare(centerInSpy.count, 3)

        // Change the popup's parent and ensure that it's anchored accordingly.
        control.parent = Qt.binding(function() { return anotherItem; })
        compare(control.parent, anotherItem)
        compare(control.anchors.centerIn, anotherItem)
        compare(centerInSpy.count, 4)
        compare(control.x, (anotherItem.width - (control.width * control.scale)) / 2)
        compare(control.y, (anotherItem.height - (control.height * control.scale)) / 2)

        // Check that anchors.centerIn beats x and y coordinates as it does in QQuickItem.
        control.x = 33;
        control.y = 44;
        compare(control.x, (anotherItem.width - (control.width * control.scale)) / 2)
        compare(control.y, (anotherItem.height - (control.height * control.scale)) / 2)

        // Check that the popup's x and y coordinates are restored when it's no longer centered.
        control.anchors.centerIn = undefined
        compare(centerInSpy.count, 5)
        compare(control.x, 33)
        compare(control.y, 44)

        // Test centering in the overlay while having a different parent (anotherItem).
        control.anchors.centerIn = overlay
        compare(centerInSpy.count, 6)
        compare(control.x, (overlay.width - (control.width * control.scale)) / 2)
        compare(control.y, (overlay.height - (control.height * control.scale)) / 2)

        // TODO: do this properly by creating a component or something
        applicationWindow.visible = false
    }

    Component {
        id: shortcutWindowComponent
        ApplicationWindow {
            id: window
            width: 360
            height: 360
            visible: true

            property alias popup: popup
            property alias shortcut: shortcut

            Popup {
                id: popup

                Shortcut {
                    id: shortcut
                    sequence: "A"
                    onActivated: popup.visible = !popup.visible
                }
            }
        }
    }

    function test_shortcut() {
        // Tests that a Shortcut with Qt.WindowShortcut context
        // that is declared within a Popup is activated.
        var window = createTemporaryObject(shortcutWindowComponent, testCase)
        var control = window.popup

        window.requestActivate()
        tryCompare(window, "active", true)

        var shortcutActivatedSpy = createTemporaryObject(signalSpy, testCase,
            { target: window.shortcut, signalName: "activated"} )
        verify(shortcutActivatedSpy.valid)

        waitForRendering(window.contentItem)
        keyClick(Qt.Key_A)
        compare(shortcutActivatedSpy.count, 1)
        tryCompare(control, "visible", true)

        keyClick(Qt.Key_A)
        compare(shortcutActivatedSpy.count, 2)
        tryCompare(control, "visible", false)
    }
}
