/****************************************************************************
**
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the Technology Preview License Agreement accompanying
** this package.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights.  These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/


#include <QtTest/QtTest>
#include <qapplication.h>
#include <q3accel.h>
#include <qtextedit.h>
#include <qmainwindow.h>
#include <qstatusbar.h>
#include <qstring.h>

class AccelForm;
QT_FORWARD_DECLARE_CLASS(QTextEdit)
QT_FORWARD_DECLARE_CLASS(QMainWindow)

//TESTED_CLASS=
//TESTED_FILES=

class tst_Q3Accel : public QObject
{
    Q_OBJECT
public:
    tst_Q3Accel();
    virtual ~tst_Q3Accel();


public slots:
    void accelTrig1() { currentResult = Accel1Triggered; }
    void accelTrig2() { currentResult = Accel2Triggered; }
    void ambig1() { currentResult = Ambiguous; ambigResult = Accel1Triggered; }
    void ambig2() { currentResult = Ambiguous; ambigResult = Accel2Triggered; }
    void statusMessage( const QString& message ) { sbText = message; }

public slots:
    void initTestCase();
private slots:
    void number_data();
    void number();
    void text_data();
    void text();
    void disabledItems();
    void ambiguousItems();
    void unicodeCompare();
    void unicodeCompose();

protected:
    static int toButtons( int key );
    void defElements();
    void sendKeyEvents( int k1, QChar c1 = 0, int k2 = 0, QChar c2 = 0, int k3 = 0, QChar c3 = 0, int k4 = 0, QChar c4 = 0 );
    void testElement();

    enum Action {
        SetupAccel,
        TestAccel,
        ClearAll
    } currentAction;

    enum Widget {
        NoWidget,
        Accel1,
        Accel2
    };

    enum Result {
        NoResult,
        Accel1Triggered,
        Accel2Triggered,
        Ambiguous
    } currentResult;

    QMainWindow *mainW;
    Q3Accel *accel1;
    Q3Accel *accel2;
    QTextEdit *edit;
    QString sbText;
    Result ambigResult;
};

// copied from qkeysequence.cpp
const QString MacCtrl = QString(QChar(0x2318));
const QString MacMeta = QString(QChar(0x2303));
const QString MacAlt = QString(QChar(0x2325));
const QString MacShift = QString(QChar(0x21E7));

tst_Q3Accel::tst_Q3Accel(): mainW( 0 )
{
}

tst_Q3Accel::~tst_Q3Accel()
{
    delete mainW;
}

void tst_Q3Accel::initTestCase()
{
    currentResult = NoResult;
    mainW = new QMainWindow(0);
    mainW->setObjectName("main window");
    mainW->setFixedSize( 100, 100 );
    accel1 = new Q3Accel(mainW, "test_accel1" );
    accel2 = new Q3Accel(mainW, "test_accel2" );
    edit   = new QTextEdit(mainW);
    edit->setObjectName("test_edit");
    connect( accel1, SIGNAL(activated(int)), this, SLOT(accelTrig1()) );
    connect( accel2, SIGNAL(activated(int)), this, SLOT(accelTrig2()) );
    connect( accel1, SIGNAL(activatedAmbiguously(int)), this, SLOT(ambig1()) );
    connect( accel2, SIGNAL(activatedAmbiguously(int)), this, SLOT(ambig2()) );
    mainW->setCentralWidget( edit );
    connect( mainW->statusBar(), SIGNAL(messageChanged(const QString&)),
             this, SLOT(statusMessage(const QString&)) );
    qApp->setMainWidget( mainW );
    mainW->show();
}

int tst_Q3Accel::toButtons( int key )
{
    int result = 0;
    if ( key & Qt::SHIFT )
        result |= Qt::ShiftModifier;
    if ( key & Qt::CTRL )
        result |= Qt::ControlModifier;
    if ( key & Qt::META )
        result |= Qt::MetaModifier;
    if ( key & Qt::ALT )
        result |= Qt::AltModifier;
    return result;
}

void tst_Q3Accel::defElements()
{
    QTest::addColumn<int>("theAction");
    QTest::addColumn<int>("theTestWidget");
    QTest::addColumn<QString>("theString");
    QTest::addColumn<int>("the1Key");
    QTest::addColumn<int>("the1Char");
    QTest::addColumn<int>("the2Key");
    QTest::addColumn<int>("the2Char");
    QTest::addColumn<int>("the3Key");
    QTest::addColumn<int>("the3Char");
    QTest::addColumn<int>("the4Key");
    QTest::addColumn<int>("the4Char");
    QTest::addColumn<int>("theResult");
}

void tst_Q3Accel::number()
{
    testElement();
}
void tst_Q3Accel::text()
{
    testElement();
}
// ------------------------------------------------------------------
// Number Elements --------------------------------------------------
// ------------------------------------------------------------------
void tst_Q3Accel::number_data()
{
    defElements();

    // Clear all
    QTest::newRow( "N00 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    //===========================================
    // [Shift + key] on non-shift accels testing
    //===========================================

    /* Testing Single Sequences
       Shift + Qt::Key_M    on  Qt::Key_M
               Qt::Key_M    on  Qt::Key_M
       Shift + Qt::Key_Plus on  Qt::Key_Pluss
               Qt::Key_Plus on  Qt::Key_Pluss
    */
    QTest::newRow( "N001 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("")
        << int(Qt::Key_M) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N001:Shift + M - [M]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_M) << int('M') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N001:M - [M]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);

    QTest::newRow( "N001 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("")
        << int(Qt::Key_Plus) << int('+') << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N001:Shift + + [+]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_Plus) << int('+') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel2Triggered);
    QTest::newRow( "N001:+ [+]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_Plus) << int('+') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel2Triggered);

    QTest::newRow( "N001 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Single Sequences
       Shift + Qt::Key_M    on  Shift + Qt::Key_M
               Qt::Key_M    on  Shift + Qt::Key_M
       Shift + Qt::Key_Plus on  Shift + Qt::Key_Pluss
               Qt::Key_Plus on  Shift + Qt::Key_Pluss
    */
    QTest::newRow( "N002 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_M) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N002:Shift + M - [Shift + M]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_M) << int('M') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N002:M - [Shift + M]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);

    QTest::newRow( "N002 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_Plus) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N002:Shift + + [Shift + +]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_Plus) << int('+') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel2Triggered);
    QTest::newRow( "N002:+ [Shift + +]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_Plus) << int('+') << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);

    QTest::newRow( "N002 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Single Sequences
       Shift + Qt::Key_F1   on  Qt::Key_F1
               Qt::Key_F1   on  Qt::Key_F1
    */
    QTest::newRow( "N003 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("")
        << int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N003:Shift + F1 - [F1]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N003:F1 - [F1]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);

    QTest::newRow( "N003 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Single Sequences
       Shift + Qt::Key_F1   on  Shift + Qt::Key_F1
               Qt::Key_F1   on  Shift + Qt::Key_F1
    */
    QTest::newRow( "N004 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N004:Shift + F1 - [Shift + F1]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N004:F1 - [Shift + F1]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);

    QTest::newRow( "N004 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Single Sequences
               Qt::Key_BackTab  on  Qt::Key_Tab
       Shift + Qt::Key_Tab      on  Qt::Key_Tab
               Qt::Key_Tab      on  Qt::Key_Tab
    */
    QTest::newRow( "N005 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("")
        << int(Qt::Key_Tab) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N005:BackTab - [Tab]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_BackTab) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N005:Shift + Tab - [Tab]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + Qt::Key_Tab << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N005:Tab - [Tab]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_Tab) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);

    QTest::newRow( "N005 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Single Sequences
               Qt::Key_BackTab  on  Shift + Qt::Key_Tab
       Shift + Qt::Key_Tab      on  Shift + Qt::Key_Tab
               Qt::Key_Tab      on  Shift + Qt::Key_Tab
    */
    QTest::newRow( "N006 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_Tab) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N006:BackTab - [Shift + Tab]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_BackTab) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N006:Shift + Tab - [Shift + Tab]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_Tab) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N006:Tab - [Shift + Tab]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_Tab) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);

    QTest::newRow( "N006 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;


    //===========================================
    // [Shift + key] and [key] on accels with
    // and without modifiers
    //===========================================

    /* Testing Single Sequences
       Qt::Key_F1
       Shift + Qt::Key_F1
    */
    QTest::newRow( "N007 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("")
        << int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N007 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N007:F1" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N007:Shift + F1" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel2Triggered);

    QTest::newRow( "N007 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Single Sequences
       Qt::Key_M
       Shift + Qt::Key_M
       Ctrl  + Qt::Key_M
       Alt   + Qt::Key_M
    */
    QTest::newRow( "N01 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("")
        << int(Qt::Key_M) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N02 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_M) << int('M') << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N03 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("")
        << int(Qt::CTRL) + int(Qt::Key_M) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N04 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("")
        << int(Qt::ALT) + int(Qt::Key_M) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);


    QTest::newRow( "N:Qt::Key_M" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_M) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N:Shift + Qt::Key_M" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_M) << int('M') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel2Triggered);
    QTest::newRow( "N:Ctrl + Qt::Key_M" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::CTRL) + int(Qt::Key_M) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N:Alt + Qt::Key_M" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::ALT) + int(Qt::Key_M) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel2Triggered);

    /* Testing Single Sequence Ambiguity
       Qt::Key_M on accel2
    */
    QTest::newRow( "N05 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("")
        << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N:int(Qt::Key_M) on int(Accel2)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << 0 << 0 << int(Ambiguous);

    /* Testing Single Specialkeys
       int(Qt::Key_aring)
       int(Qt::Key_Aring)
       UNICODE_ACCEL + int(Qt::Key_K)
    */
    QTest::newRow( "N06 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("")
        << int(Qt::Key_aring) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N08 - sA2" ) << int(SetupAccel) << int(Accel1) << QString("")
        << int(Qt::UNICODE_ACCEL) + int(Qt::Key_K) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);

    QTest::newRow( "N:int(Qt::Key_aring)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_aring) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N:int(Qt::Key_aring) - Text Form" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_unknown) << 0xE5 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N:int(Qt::Key_Aring) - Text Form" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_unknown) << 0xC5 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N:UNICODE_ACCEL + int(Qt::Key_K)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::UNICODE_ACCEL) + int(Qt::Key_K) << int('k') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);

    // Clear all
    QTest::newRow( "N09 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Multiple Sequences
       int(Qt::Key_M)
       int(Qt::Key_I), int(Qt::Key_M)
       Shift+int(Qt::Key_I), int(Qt::Key_M)
    */
    QTest::newRow( "N10 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("")
        << int(Qt::Key_M) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N11 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("")
        << int(Qt::Key_I) << 0 << int(Qt::Key_M) << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "N12 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_I) << 0 << int(Qt::Key_M) << 0 << 0 << 0 << 0 << 0 << int(NoResult);

    QTest::newRow( "N:int(Qt::Key_M) (2)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "N:int(Qt::Key_I), int(Qt::Key_M)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_I) << int('i') << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << int(Accel2Triggered);
    QTest::newRow( "N:Shift+int(Qt::Key_I), int(Qt::Key_M)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_I) << int('I') << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << int(Accel1Triggered);
}

// ------------------------------------------------------------------
// Text Elements ----------------------------------------------------
// ------------------------------------------------------------------
void tst_Q3Accel::text_data()
{
    defElements();
    // Clear all
    QTest::newRow( "T00 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    //===========================================
    // [Shift + key] on non-shift accels testing
    //===========================================

    /* Testing Single Sequences
       Shift + int(Qt::Key_M)    on  int(Qt::Key_M)
               int(Qt::Key_M)    on  int(Qt::Key_M)
       Shift + int(Qt::Key_Plus) on  Qt::Key_Pluss
               int(Qt::Key_Plus) on  Qt::Key_Pluss
    */
    QTest::newRow( "T001 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("M")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T001:Shift + M - [M]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_M) << int('M') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T001:M - [M]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);

    QTest::newRow( "T001 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("+")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T001:Shift + + [+]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_Plus) << int('+') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel2Triggered);
    QTest::newRow( "T001:+ [+]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_Plus) << int('+') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel2Triggered);

    QTest::newRow( "T001 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Single Sequences
       Shift + int(Qt::Key_M)    on  Shift + int(Qt::Key_M)
               int(Qt::Key_M)    on  Shift + int(Qt::Key_M)
       Shift + int(Qt::Key_Plus) on  Shift + Qt::Key_Pluss
               int(Qt::Key_Plus) on  Shift + Qt::Key_Pluss
       Shift + Ctrl + int(Qt::Key_Plus) on  Ctrl + Qt::Key_Pluss
               Ctrl + int(Qt::Key_Plus) on  Ctrl + Qt::Key_Pluss
    */
    QTest::newRow( "T002 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("Shift+M")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T002:Shift + M - [Shift + M]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_M) << int('M') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T002:M - [Shift + M]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);

    QTest::newRow( "T002 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("Shift++")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T002:Shift + + [Shift + +]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_Plus) << int('+') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel2Triggered);
    QTest::newRow( "T002:+ [Shift + +]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_Plus) << int('+') << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);

    QTest::newRow( "T002 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Single Sequences
       Shift + Ctrl + int(Qt::Key_Plus) on  Ctrl + int(Qt::Key_Plus)
               Ctrl + int(Qt::Key_Plus) on  Ctrl + int(Qt::Key_Plus)
                      int(Qt::Key_Plus) on  Ctrl + int(Qt::Key_Plus)
    */
    QTest::newRow( "T002b - sA1" ) << int(SetupAccel) << int(Accel1) << QString("Ctrl++")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T002b:Shift + Ctrl + + [Ctrl + +]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::CTRL) + int(Qt::Key_Plus) << int('+') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T002b:Ctrl + [Ctrl + +]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::CTRL) + int(Qt::Key_Plus) << int('+') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T002b: + [Ctrl + +]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_Plus) << int('+') << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);

    /* Testing Single Sequences
       Shift + int(Qt::Key_F1)   on  int(Qt::Key_F1)
               int(Qt::Key_F1)   on  int(Qt::Key_F1)
    */
    QTest::newRow( "T003 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("F1")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T003:Shift + F1 - [F1]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T003:F1 - [F1]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);

    QTest::newRow( "T003 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Single Sequences
       Shift + int(Qt::Key_F1)   on  Shift + int(Qt::Key_F1)
               int(Qt::Key_F1)   on  Shift + int(Qt::Key_F1)
    */
    QTest::newRow( "T004 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("Shift+F1")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T004:Shift + F1 - [Shift + F1]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T004:F1 - [Shift + F1]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);

    QTest::newRow( "T004 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Single Sequences
               int(Qt::Key_BackTab)  on  int(Qt::Key_Tab)
       Shift + int(Qt::Key_Tab)      on  int(Qt::Key_Tab)
               int(Qt::Key_Tab)      on  int(Qt::Key_Tab)
    */
    QTest::newRow( "T005 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("Tab")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T005:BackTab - [Tab]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_BackTab) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T005:Shift + Tab - [Tab]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_Tab) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T005:Tab - [Tab]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_Tab) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);

    QTest::newRow( "N005 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Single Sequences
               int(Qt::Key_BackTab)  on  Shift + int(Qt::Key_Tab)
       Shift + int(Qt::Key_Tab)      on  Shift + int(Qt::Key_Tab)
               int(Qt::Key_Tab)      on  Shift + int(Qt::Key_Tab)
    */
    QTest::newRow( "T006 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("Shift+Tab")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T006:BackTab - [Shift + Tab]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_BackTab) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T006:Shift + Tab - [Shift + Tab]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_Tab) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T006:Tab - [Shift + Tab]" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_Tab) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);

    QTest::newRow( "T006 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    //===========================================
    // [Shift + key] and [key] on accels with
    // and without modifiers
    //===========================================

    /* Testing Single Sequences
       int(Qt::Key_F1)
       Shift + int(Qt::Key_F1)
    */
    QTest::newRow( "T007 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("F1")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T007 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("Shift+F1")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T007:F1" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T007:Shift + F1" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_F1) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel2Triggered);

    QTest::newRow( "T005 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Single Sequences
       int(Qt::Key_M)
       Shift + int(Qt::Key_M)
       Ctrl  + int(Qt::Key_M)
       Alt   + int(Qt::Key_M)
    */
    QTest::newRow( "T01 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("M")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T02 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("Shift+M")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T03 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("Ctrl+M")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T04 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("Alt+M")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);


    QTest::newRow( "T:int(Qt::Key_M)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T:Shift + int(Qt::Key_M)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_M) << int('M') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel2Triggered);
    QTest::newRow( "T:Ctrl + int(Qt::Key_M)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::CTRL) + int(Qt::Key_M) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T:Alt + int(Qt::Key_M)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::ALT) + int(Qt::Key_M) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel2Triggered);

    /* Testing Single Sequence Ambiguity
       int(Qt::Key_M) on accel2
    */
    QTest::newRow( "T05 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("M")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T:int(Qt::Key_M) on int(Accel2)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << 0 << 0 << int(Ambiguous);

    /* Testing Single Specialkeys
       int(Qt::Key_aring)
       int(Qt::Key_Aring)
       UNICODE_ACCEL + int(Qt::Key_K)
    */
    /* see comments above on the #ifdef'ery */
    QTest::newRow( "T06 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("\x0E5")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T08 - sA2" ) << int(SetupAccel) << int(Accel1) << QString("K")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);

    QTest::newRow( "T:int(Qt::Key_aring)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_aring) << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T:int(Qt::Key_aring) - Text Form" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_unknown) << 0xE5 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T:int(Qt::Key_Aring) - Text Form" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_unknown) << 0xC5 << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T:UNICODE_ACCEL + int(Qt::Key_K)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::UNICODE_ACCEL) + int(Qt::Key_K) << int('k') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);

    // Clear all
    QTest::newRow( "T09 - clear" ) << int(ClearAll) <<0<<QString("")<<0<<0<<0<<0<<0<<0<<0<<0<<0;

    /* Testing Multiple Sequences
       int(Qt::Key_M)
       int(Qt::Key_I), int(Qt::Key_M)
       Shift+int(Qt::Key_I), int(Qt::Key_M)
    */
    QTest::newRow( "T10 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("M")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T11 - sA2" ) << int(SetupAccel) << int(Accel2) << QString("I, M")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);
    QTest::newRow( "T12 - sA1" ) << int(SetupAccel) << int(Accel1) << QString("Shift+I, M")
        << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << int(NoResult);

    QTest::newRow( "T:int(Qt::Key_M) (2)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << 0 << 0 << int(Accel1Triggered);
    QTest::newRow( "T:int(Qt::Key_I), int(Qt::Key_M)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::Key_I) << int('i') << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << int(Accel2Triggered);
    QTest::newRow( "T:Shift+int(Qt::Key_I), int(Qt::Key_M)" ) << int(TestAccel) << int(NoWidget) << QString("")
        << int(Qt::SHIFT) + int(Qt::Key_I) << int('I') << int(Qt::Key_M) << int('m') << 0 << 0 << 0 << 0 << int(Accel1Triggered);
}

// ------------------------------------------------------------------
// Disabled Elements ------------------------------------------------
// ------------------------------------------------------------------
void tst_Q3Accel::disabledItems()
{
    accel1->setEnabled( TRUE );
    accel2->setEnabled( TRUE );

    /* Testing Disabled Accel
       Qt::Key_M          on A1
       Shift + Qt::Key_M  on A1
       Qt::Key_M          on A2 (disabled)
       Shift + Qt::Key_M  on A2 (disabled)
    */
    accel1->clear();
    accel2->clear();
    accel1->insertItem( QKeySequence("M") );
    accel1->insertItem( QKeySequence("Shift+M") );
    accel2->insertItem( QKeySequence("M") );
    accel2->insertItem( QKeySequence("Shift+M") );
    accel2->setEnabled( FALSE );
    currentResult = NoResult;
    sendKeyEvents( Qt::Key_M, 'm' );
    QCOMPARE( currentResult, Accel1Triggered );
    currentResult = NoResult;
    sendKeyEvents( Qt::SHIFT+Qt::Key_M, 'M' );
    QCOMPARE( currentResult, Accel1Triggered );
    accel2->setEnabled( TRUE ); //PS!

    /* Testing Disabled Accel
       Qt::Key_M          on A1
       Shift + Qt::Key_M  on A1 (disabled)
       Qt::Key_M          on A2 (disabled)
       Shift + Qt::Key_M  on A2
    */
    accel1->clear();
    accel2->clear();
    accel1->insertItem( QKeySequence("M") );
    int i1 = accel1->insertItem( QKeySequence("Shift+M") );
    int i2 = accel2->insertItem( QKeySequence("M") );
    accel2->insertItem( QKeySequence("Shift+M") );
    accel1->setItemEnabled( i1, FALSE );
    accel2->setItemEnabled( i2, FALSE );
    currentResult = NoResult;
    sendKeyEvents( Qt::Key_M, 'm' );
    QCOMPARE( currentResult, Accel1Triggered );
    currentResult = NoResult;
    sendKeyEvents( Qt::SHIFT+Qt::Key_M, 'M' );
    QCOMPARE( currentResult, Accel2Triggered );

    /* Testing Disabled Accel Items
       Qt::Key_F5          on A1
       Shift + Qt::Key_F5  on A2 (disabled)
    */
    accel1->clear();
    accel2->clear();
    i1 = accel1->insertItem( QKeySequence("F5") );
    i2 = accel2->insertItem( QKeySequence("Shift+F5") );
    accel1->setItemEnabled( i1, TRUE );
    accel2->setItemEnabled( i2, FALSE );
    currentResult = NoResult;
    sendKeyEvents( Qt::Key_F5, 0 );
    QCOMPARE( currentResult, Accel1Triggered );
    currentResult = NoResult;
    sendKeyEvents( Qt::SHIFT+Qt::Key_F5, 0 );
    QCOMPARE( currentResult, NoResult );

    /* Testing Disabled Accel
       Qt::Key_F5          on A1
       Shift + Qt::Key_F5  on A2 (disabled)
    */
    accel1->clear();
    accel2->clear();
    i1 = accel1->insertItem( QKeySequence("F5") );
    i2 = accel2->insertItem( QKeySequence("Shift+F5") );
    accel1->setEnabled( TRUE );
    accel2->setEnabled( FALSE );
    currentResult = NoResult;
    sendKeyEvents( Qt::Key_F5, 0 );
    QCOMPARE( currentResult, Accel1Triggered );
    currentResult = NoResult;
    sendKeyEvents( Qt::SHIFT+Qt::Key_F5, 0 );
    QCOMPARE( currentResult, NoResult );



    /* Testing Disabled Accel, and the corresponding statusbar feedback
       Ctrl + Qt::Key_K, Ctrl + Qt::Key_L on A1
       Ctrl + Qt::Key_K, Ctrl + Qt::Key_M on A2 (disabled)
    */
    accel1->clear();
    accel2->clear();
    i1 = accel1->insertItem( QKeySequence("Ctrl+K, Ctrl+L") );
    i2 = accel2->insertItem( QKeySequence("Ctrl+K, Ctrl+M") );
    accel1->setItemEnabled( i1, TRUE );
    accel2->setItemEnabled( i2, FALSE );
    currentResult = NoResult;
    sendKeyEvents( Qt::CTRL+Qt::Key_K, 0 );
    sendKeyEvents( Qt::CTRL+Qt::Key_Q, 0 );
    QCOMPARE( currentResult, NoResult );
#ifndef Q_WS_MAC
    QCOMPARE( sbText, QString("Ctrl+K, Ctrl+Q not defined") );
#else
    QCOMPARE(sbText, MacCtrl + "K, " + MacCtrl + "Q not defined");
#endif
    currentResult = NoResult;
    sendKeyEvents( Qt::CTRL+Qt::Key_K, 0 );
    sendKeyEvents( Qt::CTRL+Qt::Key_M, 0 );
    QCOMPARE( currentResult, NoResult );
    QCOMPARE(sbText, QString());
    currentResult = NoResult;
    sendKeyEvents( Qt::CTRL+Qt::Key_K, 0 );
    sendKeyEvents( Qt::CTRL+Qt::Key_L, 0 );
    QCOMPARE( currentResult, Accel1Triggered );
    QCOMPARE(sbText, QString());

    accel1->setEnabled( TRUE );
    accel2->setEnabled( TRUE );
}

// ------------------------------------------------------------------
// Ambiguous Elements -----------------------------------------------
// ------------------------------------------------------------------
void tst_Q3Accel::ambiguousItems()
{
    accel1->setEnabled( TRUE );
    accel2->setEnabled( TRUE );

    /* Testing Disabled Accel
       Qt::Key_M  on A1
       Qt::Key_M  on A2
    */
    accel1->clear();
    accel2->clear();
    accel1->insertItem( QKeySequence("M") );
    accel2->insertItem( QKeySequence("M") );
    currentResult = NoResult;
    sendKeyEvents( Qt::Key_M, 'm' );
    QCOMPARE( currentResult, Ambiguous );
    QCOMPARE( ambigResult, Accel1Triggered );
    currentResult = NoResult;
    sendKeyEvents( Qt::Key_M, 'm' );
    QCOMPARE( currentResult, Ambiguous );
    QCOMPARE( ambigResult, Accel2Triggered );
    currentResult = NoResult;
    sendKeyEvents( Qt::Key_M, 'm' );
    QCOMPARE( currentResult, Ambiguous );
    QCOMPARE( ambigResult, Accel1Triggered );

    accel1->setEnabled( TRUE );
    accel2->setEnabled( TRUE );
}

// ------------------------------------------------------------------
// Unicode and non-unicode Elements ---------------------------------
// ------------------------------------------------------------------
void tst_Q3Accel::unicodeCompare()
{
    accel1->setEnabled( TRUE );
    accel2->setEnabled( TRUE );

    QKeySequence ks1("Ctrl+M");
    QKeySequence ks2( Qt::CTRL+Qt::Key_M );
    accel1->clear();
    accel2->clear();
    accel1->insertItem( ks1 );
    accel2->insertItem( ks2 );
    currentResult = NoResult;
    sendKeyEvents( Qt::CTRL+Qt::Key_M, 0 );
    QCOMPARE( currentResult, Ambiguous );
    // They _are_ ambiguous, so the QKeySequence operator==
    // should indicate the same
    QVERIFY( ks1 == ks2 );
    QVERIFY( !(ks1 != ks2) );
}

// ------------------------------------------------------------------
// Unicode composed keys using keypad, and number accels ------------
// ------------------------------------------------------------------
void tst_Q3Accel::unicodeCompose()
{
    accel1->setEnabled( TRUE );
    accel2->setEnabled( TRUE );

#if 0
//#if QT_VERSION >= 0x30200
    accel1->clear();
    accel2->clear();
    accel1->insertItem( META+Qt::Key_9 );
    edit->setFocus();
    currentResult = NoResult;

    // Turn on unicode composing, and
    // compose a smileyface. ( 9786 = 0x263A )
    QApplication::setMetaComposedUnicode();
    QChar ch1( '9' );
    QChar ch2( '7' );
    QChar ch3( '8' );
    QChar ch4( '6' );
    QString s1( ch1 );
    QString s2( ch2 );
    QString s3( ch3 );
    QString s4( ch4 );
    QKeyEvent k1a( QEvent::AccelOverride, Qt::Key_9, ch1.row() ? 0 : ch1.cell(), Qt::MetaModifier + Qt::KeypadModifier, s1 );
    QKeyEvent k1p( QEvent::KeyPress, Qt::Key_9, ch1.row() ? 0 : ch1.cell(), Qt::MetaModifier + Qt::KeypadModifier, s1 );
    QKeyEvent k1r( QEvent::KeyRelease, Qt::Key_9, ch1.row() ? 0 : ch1.cell(), Qt::MetaModifier + Qt::KeypadModifier, s1 );
    QKeyEvent k2a( QEvent::AccelOverride, Qt::Key_7, ch2.row() ? 0 : ch2.cell(), Qt::MetaModifier + Qt::KeypadModifier, s2 );
    QKeyEvent k2p( QEvent::KeyPress, Qt::Key_7, ch2.row() ? 0 : ch2.cell(), Qt::MetaModifier + Qt::KeypadModifier, s2 );
    QKeyEvent k2r( QEvent::KeyRelease, Qt::Key_7, ch2.row() ? 0 : ch2.cell(), Qt::MetaModifier + Qt::KeypadModifier, s2 );
    QKeyEvent k3a( QEvent::AccelOverride, Qt::Key_8, ch3.row() ? 0 : ch3.cell(), Qt::MetaModifier + Qt::KeypadModifier, s3 );
    QKeyEvent k3p( QEvent::KeyPress, Qt::Key_8, ch3.row() ? 0 : ch3.cell(), Qt::MetaModifier + Qt::KeypadModifier, s3 );
    QKeyEvent k3r( QEvent::KeyRelease, Qt::Key_8, ch3.row() ? 0 : ch3.cell(), Qt::MetaModifier + Qt::KeypadModifier, s3 );
    QKeyEvent k4a( QEvent::AccelOverride, Qt::Key_6, ch4.row() ? 0 : ch4.cell(), Qt::MetaModifier + Qt::KeypadModifier, s4 );
    QKeyEvent k4p( QEvent::KeyPress, Qt::Key_6, ch4.row() ? 0 : ch4.cell(), Qt::MetaModifier + Qt::KeypadModifier, s4 );
    QKeyEvent k4r( QEvent::KeyRelease, Qt::Key_6, ch4.row() ? 0 : ch4.cell(), Qt::MetaModifier + Qt::KeypadModifier, s4 );
    QKeyEvent k5r( QEvent::KeyRelease, Qt::Key_Meta, 0, 0, "" );
    QApplication::sendEvent( edit, &k1a );
    QApplication::sendEvent( edit, &k1p );
    QApplication::sendEvent( edit, &k1r );
    QCOMPARE( currentResult, NoResult );

    QApplication::sendEvent( edit, &k2a );
    QApplication::sendEvent( edit, &k2p );
    QApplication::sendEvent( edit, &k2r );
    QCOMPARE( currentResult, NoResult );

    QApplication::sendEvent( edit, &k3a );
    QApplication::sendEvent( edit, &k3p );
    QApplication::sendEvent( edit, &k3r );
    QCOMPARE( currentResult, NoResult );

    QApplication::sendEvent( edit, &k4a );
    QApplication::sendEvent( edit, &k4p );
    QApplication::sendEvent( edit, &k4r );
    QCOMPARE( currentResult, NoResult );

    QApplication::sendEvent( edit, &k5r );
    // Unicode character is fully composed, and
    // shouldn't have triggered any accels
    QCOMPARE( currentResult, NoResult );

    // Verify that the unicode character indeed
    // is composed
    QVERIFY( edit->text().length() == 1 );
    QCOMPARE( (int)edit->text()[0].unicode(), 9786 );

    sendKeyEvents( META+Qt::Key_9, 0 );
    QCOMPARE( currentResult, Accel1Triggered );
#else
    QSKIP( "Unicode composing non-existant in Qt 3.y.z", SkipAll);
#endif
}

// ------------------------------------------------------------------
// Element Testing  -------------------------------------------------
// ------------------------------------------------------------------
void tst_Q3Accel::testElement()
{
#if 0
    currentResult = NoResult;
    QFETCH( int, theAction );
    QFETCH( int, theTestWidget );
    QFETCH( QString, theString );
    QFETCH( int, the1Key );
    QFETCH( int, the1Char );
    QFETCH( int, the2Key );
    QFETCH( int, the2Char );
    QFETCH( int, the3Key );
    QFETCH( int, the3Char );
    QFETCH( int, the4Key );
    QFETCH( int, the4Char );
    QFETCH( int, theResult );

    Q3Accel *ac = 0;
    switch( theTestWidget ) {
    case Accel1:
        ac = accel1;
        break;
    case Accel2:
        ac = accel2;
        break;
    case NoWidget:
    default:
        ac = 0;
    }

    if ( theAction == ClearAll ) {
        // Clear all current accelerators
        accel1->clear();
        accel2->clear();
        QCOMPARE( TRUE, TRUE );
    } else if ( theAction == SetupAccel ) {
        // Set up accelerator for next test
        QKeySequence ks;
        if ( QString(theString).isEmpty() ) {
            ks =  QKeySequence( the1Key, the2Key, the3Key, the4Key );
        } else {
            ks = QKeySequence( theString );
        }
        ac->insertItem( ks );
        QCOMPARE( TRUE, TRUE );
    } else {
        // Send keyevents
        sendKeyEvents( the1Key, the1Char,
                       the2Key, the2Char,
                       the3Key, the3Char,
                       the4Key, the4Char );
        // Verify the result
        QCOMPARE( currentResult, theResult );
    }
#endif
}

void tst_Q3Accel::sendKeyEvents( int k1, QChar c1, int k2, QChar c2, int k3, QChar c3, int k4, QChar c4 )
{
    int b1 = toButtons( k1 );
    int b2 = toButtons( k2 );
    int b3 = toButtons( k3 );
    int b4 = toButtons( k4 );
    k1 &= ~Qt::MODIFIER_MASK;
    k2 &= ~Qt::MODIFIER_MASK;
    k3 &= ~Qt::MODIFIER_MASK;
    k4 &= ~Qt::MODIFIER_MASK;
    QKeyEvent ke( QEvent::Accel, k1, (Qt::KeyboardModifiers)b1, QString(c1) );
    QApplication::sendEvent( mainW, &ke );
    if ( k2 ) {
        QKeyEvent ke( QEvent::Accel, k2, k2, b2, QString(c2) );
        QApplication::sendEvent( mainW, &ke );
    }
    if ( k3 ) {
        QKeyEvent ke( QEvent::Accel, k3, k3, b3, QString(c3) );
        QApplication::sendEvent( mainW, &ke );
    }
    if ( k4 ) {
        QKeyEvent ke( QEvent::Accel, k4, k4, b4, QString(c4) );
        QApplication::sendEvent( mainW, &ke );
    }
}

QTEST_MAIN(tst_Q3Accel)
#include "tst_q3accel.moc"
