2
Copyright 2008 by Robert Knight <robertknight@gmail.com>
4
This program is free software; you can redistribute it and/or modify
5
it under the terms of the GNU General Public License as published by
6
the Free Software Foundation; either version 2 of the License, or
7
(at your option) any later version.
9
This program is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
GNU General Public License for more details.
14
You should have received a copy of the GNU General Public License
15
along with this program; if not, write to the Free Software
16
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24
#include <QtGui/QWidget>
25
#include <QtGui/QLabel>
26
#include <QtGui/QVBoxLayout>
27
#include <QtGui/QKeyEvent>
28
#include <qtestkeyboard.h>
32
#include <sys/types.h>
37
#include <KPluginLoader>
38
#include <KPluginFactory>
39
#include <KParts/Part>
40
#include <KPtyProcess>
43
#include <KMainWindow>
44
#include <qtest_kde.h>
48
#include "../Session.h"
49
#include "../KeyboardTranslator.h"
51
using namespace Konsole;
53
void PartTest::testFd()
55
// start a pty process
56
KPtyProcess ptyProcess;
57
ptyProcess.setProgram("/bin/ping",QStringList() << "localhost");
58
ptyProcess.setPtyChannels(KPtyProcess::AllChannels);
60
QVERIFY(ptyProcess.waitForStarted());
62
int fd = ptyProcess.pty()->masterFd();
64
// create a Konsole part and attempt to connect to it
65
KParts::Part* terminalPart = createPart();
66
bool result = QMetaObject::invokeMethod(terminalPart,"openTeletype",
67
Qt::DirectConnection,Q_ARG(int,fd));
70
// suspend the KPtyDevice so that the embedded terminal gets a chance to
71
// read from the pty. Otherwise the KPtyDevice will simply read everything
72
// as soon as it becomes available and the terminal will not display any output
73
ptyProcess.pty()->setSuspended(true);
75
KDialog* dialog = new KDialog();
76
dialog->setButtons(0);
77
QVBoxLayout* layout = new QVBoxLayout(dialog->mainWidget());
78
layout->addWidget(new QLabel("Output of 'ping localhost' should appear in a terminal below for 5 seconds"));
79
layout->addWidget(terminalPart->widget());
80
QTimer::singleShot(5000,dialog,SLOT(close()));
86
ptyProcess.waitForFinished(1000);
88
void PartTest::testShortcutOverride()
90
// FIXME: This test asks the user to press shortcut key sequences manually because
91
// the result is different than when sending the key press via QTest::keyClick()
93
// When the key presses are sent manually, Konsole::TerminalDisplay::event() is called
94
// and the overrideShortcut() signal is emitted by the part.
95
// When the key presses are sent automatically, the shortcut is triggered but
96
// Konsole::TerminalDisplay::event() is not called and the overrideShortcut() signal is
97
// not emitted by the part.
99
// Create a main window with a menu and a test
100
// action with a shortcut set to Ctrl+S, which is also used by the terminal
101
KMainWindow* mainWindow = new KMainWindow();
102
QMenu* fileMenu = mainWindow->menuBar()->addMenu("File");
103
QAction* testAction = fileMenu->addAction("Test");
104
testAction->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_S));
105
connect(testAction,SIGNAL(triggered()),this,SLOT(shortcutTriggered()));
107
// Create terminal part and embed in into the main window
108
KParts::Part* terminalPart = createPart();
109
QVERIFY(terminalPart);
110
mainWindow->setCentralWidget(terminalPart->widget());
111
TerminalInterface* terminal = qobject_cast<TerminalInterface*>(terminalPart);
113
terminal->sendInput("Press Ctrl+S twice.\n");
116
// Test shortcut with override disabled, so the shortcut will be triggered
117
_shortcutTriggered = false;
119
_overrideCalled = false;
120
QVERIFY( connect(terminalPart,SIGNAL(overrideShortcut(QKeyEvent*,bool&)),
121
this,SLOT(overrideShortcut(QKeyEvent*,bool&))) );
123
//QTest::keyClick(terminalPart->widget(),Qt::Key_S,Qt::ControlModifier);
124
_shortcutEventLoop = new QEventLoop();
125
_shortcutEventLoop->exec();
127
QVERIFY(_overrideCalled);
128
QVERIFY(_shortcutTriggered);
131
// Test shortcut with override enabled, so the shortcut will not be triggered
133
_overrideCalled = false;
134
_shortcutTriggered = false;
136
//QTest::keyClick(terminalPart->widget(),Qt::Key_S,Qt::ControlModifier);
137
_shortcutEventLoop->exec();
139
QVERIFY(_overrideCalled);
140
QVERIFY(!_shortcutTriggered);
143
delete _shortcutEventLoop;
147
void PartTest::overrideShortcut(QKeyEvent* event,bool& override)
149
QVERIFY(override == true);
150
if (event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_S)
152
_overrideCalled = true;
153
override = _override;
154
_shortcutEventLoop->exit();
157
void PartTest::shortcutTriggered()
159
_shortcutTriggered = true;
162
KParts::Part* PartTest::createPart()
164
KPluginLoader loader("libkonsolepart");
165
KPluginFactory* factory = loader.factory();
168
KParts::Part* terminalPart = factory->create<KParts::Part>(this);
173
QTEST_KDEMAIN( PartTest , GUI )
175
#include "PartTest.moc"