/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** 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.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
    \class QSignalSpy
    \inmodule QtTest

    \brief The QSignalSpy class enables introspection of signal emission.

    QSignalSpy can connect to any signal of any object and records its emission.
    QSignalSpy itself is a list of QVariant lists. Each emission of the signal
    will append one item to the list, containing the arguments of the signal.

    The following example records all signal emissions for the \c clicked() signal
    of a QCheckBox:

    \snippet code/doc_src_qsignalspy.cpp 0

    \c{spy.takeFirst()} returns the arguments for the first emitted signal, as a
    list of QVariant objects. The \c clicked() signal has a single bool argument,
    which is stored as the first entry in the list of arguments.

    The example below catches a signal from a custom object:

    \snippet code/doc_src_qsignalspy.cpp 1

    \note Non-standard data types need to be registered, using
    the qRegisterMetaType() function, before you can create a
    QSignalSpy. For example:

    \snippet code/doc_src_qsignalspy.cpp 2

    To retrieve the instance, you can use qvariant_cast:

    \snippet code/doc_src_qsignalspy.cpp 3

    \section1 Verifying Signal Emissions

    The QSignalSpy class provides an elegant mechanism for capturing the list
    of signals emitted by an object. However, you should verify its validity
    after construction. The constructor does a number of sanity checks, such as
    verifying that the signal to be spied upon actually exists. To make the
    diagnosis of test failures easier, the results of these checks should be
    checked by calling \c QVERIFY(spy.isValid()) before proceeding further with
    a test.

    \sa QVERIFY()
 */

/*! \fn QSignalSpy::QSignalSpy(const QObject *object, const char *signal)

    Constructs a new QSignalSpy that listens for emissions of the \a signal
    from the QObject \a object. If QSignalSpy is not able to listen for a
    valid signal (for example, because \a object is \nullptr or \a signal does
    not denote a valid signal of \a object), an explanatory warning message
    will be output using qWarning() and subsequent calls to \c isValid() will
    return false.

    Example:
    \snippet code/doc_src_qsignalspy.cpp 4
*/

/*! \fn template <typename PointerToMemberFunction> QSignalSpy::QSignalSpy(const QObject *object, PointerToMemberFunction signal)
    \since 5.4

    Constructs a new QSignalSpy that listens for emissions of the \a signal
    from the QObject \a object. If QSignalSpy is not able to listen for a
    valid signal (for example, because \a object is \nullptr or \a signal does
    not denote a valid signal of \a object), an explanatory warning message
    will be output using qWarning() and subsequent calls to \c isValid() will
    return false.

    Example:
    \snippet code/doc_src_qsignalspy.cpp 6
*/

/*! \fn QSignalSpy::QSignalSpy(const QObject *obj, const QMetaMethod &signal)
    \since 5.14

    Constructs a new QSignalSpy that listens for emissions of the \a signal
    from the QObject \a obj. If QSignalSpy is not able to listen for a
    valid signal (for example, because \a obj is \nullptr or \a signal does
    not denote a valid signal of \a obj), an explanatory warning message
    will be output using qWarning() and subsequent calls to \c isValid() will
    return false.

    This constructor is convenient to use when Qt's meta-object system is
    heavily used in a test.

    Basic usage example:
    \snippet code/doc_src_qsignalspy.cpp 7

    Imagine we need to check whether all properties of the QWindow class
    that represent minimum and maximum dimensions are properly writable.
    The following example demonstrates one of the approaches:
    \snippet code/doc_src_qsignalspy.cpp 8
*/

/*! \fn QSignalSpy::isValid() const

    Returns \c true if the signal spy listens to a valid signal, otherwise false.
*/

/*! \fn QSignalSpy::signal() const

    Returns the normalized signal the spy is currently listening to.
*/

/*! \fn int QSignalSpy::qt_metacall(QMetaObject::Call call, int id, void **a)
    \internal
*/

/*! \fn QSignalSpy::wait(int timeout)

    \since 5.0

    Starts an event loop that runs until the given signal is received.
    Optionally the event loop can return earlier on a \a timeout (in milliseconds).

    Returns \c true if the signal was emitted at least once in \a timeout milliseconds, otherwise returns \c false.

    Example:
    \snippet code/doc_src_qsignalspy.cpp 5
*/
