diff options
Diffstat (limited to 'sources/pyside2/tests/signals/signal_emission_test.py')
-rw-r--r-- | sources/pyside2/tests/signals/signal_emission_test.py | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/sources/pyside2/tests/signals/signal_emission_test.py b/sources/pyside2/tests/signals/signal_emission_test.py new file mode 100644 index 000000000..8e36d9826 --- /dev/null +++ b/sources/pyside2/tests/signals/signal_emission_test.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python + +############################################################################# +## +## Copyright (C) 2016 The Qt Company Ltd. +## Contact: https://www.qt.io/licensing/ +## +## This file is part of the test suite of PySide2. +## +## $QT_BEGIN_LICENSE:GPL-EXCEPT$ +## 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 General Public License Usage +## Alternatively, this file may be used under the terms of the GNU +## General Public License version 3 as published by the Free Software +## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +## included in the packaging of this file. Please review the following +## information to ensure the GNU General Public License requirements will +## be met: https://www.gnu.org/licenses/gpl-3.0.html. +## +## $QT_END_LICENSE$ +## +############################################################################# + +"""Tests covering signal emission and receiving to python slots""" + +import sys +import unittest +import functools + +from PySide2.QtCore import QObject, SIGNAL, SLOT, QProcess, QTimeLine + +from helper import BasicPySlotCase, UsesQCoreApplication + + +class ArgsOnEmptySignal(UsesQCoreApplication): + '''Trying to emit a signal without arguments passing some arguments''' + + def testArgsToNoArgsSignal(self): + '''Passing arguments to a signal without arguments''' + process = QProcess() + self.assertRaises(TypeError, process.emit, SIGNAL('started()'), 42) + + +class MoreArgsOnEmit(UsesQCoreApplication): + '''Trying to pass more args than needed to emit (signals with args)''' + + def testMoreArgs(self): + '''Passing more arguments than needed''' + process = QProcess() + self.assertRaises(TypeError, process.emit, SIGNAL('finished(int)'), 55, 55) + +class Dummy(QObject): + '''Dummy class''' + pass + +class PythonSignalToCppSlots(UsesQCoreApplication): + '''Connect python signals to C++ slots''' + + def testWithoutArgs(self): + '''Connect python signal to QTimeLine.toggleDirection()''' + timeline = QTimeLine() + dummy = Dummy() + QObject.connect(dummy, SIGNAL('dummy()'), + timeline, SLOT('toggleDirection()')) + + orig_dir = timeline.direction() + dummy.emit(SIGNAL('dummy()')) + new_dir = timeline.direction() + + if orig_dir == QTimeLine.Forward: + self.assertEqual(new_dir, QTimeLine.Backward) + else: + self.assertEqual(new_dir, QTimeLine.Forward) + + def testWithArgs(self): + '''Connect python signals to QTimeLine.setCurrentTime(int)''' + timeline = QTimeLine() + dummy = Dummy() + + QObject.connect(dummy, SIGNAL('dummy(int)'), + timeline, SLOT('setCurrentTime(int)')) + + current = timeline.currentTime() + dummy.emit(SIGNAL('dummy(int)'), current+42) + self.assertEqual(timeline.currentTime(), current+42) + +class CppSignalsToCppSlots(UsesQCoreApplication): + '''Connection between C++ slots and signals''' + + def testWithoutArgs(self): + '''Connect QProcess.started() to QTimeLine.togglePaused()''' + process = QProcess() + timeline = QTimeLine() + + QObject.connect(process, SIGNAL('finished(int, QProcess::ExitStatus)'), + timeline, SLOT('toggleDirection()')) + + orig_dir = timeline.direction() + + process.start(sys.executable, ['-c', '"print 42"']) + process.waitForFinished() + + new_dir = timeline.direction() + + if orig_dir == QTimeLine.Forward: + self.assertEqual(new_dir, QTimeLine.Backward) + else: + self.assertEqual(new_dir, QTimeLine.Forward) + +called = False +def someSlot(args=None): + global called + called = True + +class DynamicSignalsToFuncPartial(UsesQCoreApplication): + + def testIt(self): + global called + called = False + o = QObject() + o.connect(o, SIGNAL("ASignal()"), functools.partial(someSlot, "partial ..")) + o.emit(SIGNAL("ASignal()")) + self.assertTrue(called) + +class EmitUnknownType(UsesQCoreApplication): + def testIt(self): + a = QObject() + a.connect(SIGNAL('foobar(Dummy)'), lambda x: 42) # Just connect with an unknown type + self.assertRaises(TypeError, a.emit, SIGNAL('foobar(Dummy)'), 22) + +class EmitEnum(UsesQCoreApplication): + """Test emission of enum arguments""" + + def slot(self, arg): + self.arg = arg + + def testIt(self): + self.arg = None + p = QProcess() + p.stateChanged.connect(self.slot) + p.stateChanged.emit(QProcess.NotRunning) + self.assertEqual(self.arg, QProcess.NotRunning) + +if __name__ == '__main__': + unittest.main() |