ctkAbstractPythonManagerTest.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. // Qt includes
  2. #include <QTemporaryFile>
  3. #include <QTextStream>
  4. // CTK includes
  5. #include "ctkAbstractPythonManager.h"
  6. #include "ctkTest.h"
  7. // PythonQt includes
  8. #include <PythonQt.h>
  9. // STD includes
  10. #include <cstdlib>
  11. #include <iostream>
  12. //-----------------------------------------------------------------------------
  13. #if QT_VERSION < 0x040700
  14. Q_DECLARE_METATYPE(QVariant)
  15. #endif
  16. //-----------------------------------------------------------------------------
  17. class ctkAbstractPythonManagerTester: public QObject
  18. {
  19. Q_OBJECT
  20. private:
  21. ctkAbstractPythonManager PythonManager;
  22. private Q_SLOTS:
  23. void testIsPythonInitialized();
  24. void testSetInitializationFlags();
  25. void testPythonErrorOccured();
  26. void testPythonErrorOccured_data();
  27. void testInitialize();
  28. void testMainContext();
  29. void testAddObjectToPythonMain();
  30. //void testRegisterPythonQtDecorator(); // TODO
  31. //void testRegisterClassForPythonQt(); // TODO
  32. void testExecuteString();
  33. void testExecuteString_data();
  34. void testExecuteFile();
  35. void testExecuteFile_data();
  36. //void testPythonAttributes(); // TODO
  37. };
  38. // ----------------------------------------------------------------------------
  39. void ctkAbstractPythonManagerTester::testIsPythonInitialized()
  40. {
  41. QCOMPARE(this->PythonManager.isPythonInitialized(), false);
  42. }
  43. // ----------------------------------------------------------------------------
  44. void ctkAbstractPythonManagerTester::testSetInitializationFlags()
  45. {
  46. QCOMPARE(this->PythonManager.initializationFlags(), PythonQt::IgnoreSiteModule | PythonQt::RedirectStdOut);
  47. int flagsToSetPreInit = PythonQt::RedirectStdOut;
  48. int expectedFlagsPreInit = PythonQt::RedirectStdOut;
  49. this->PythonManager.setInitializationFlags(flagsToSetPreInit);
  50. QCOMPARE(this->PythonManager.initializationFlags(), expectedFlagsPreInit);
  51. this->PythonManager.mainContext();
  52. int flagsToSetPostInit = 0;
  53. int expectedFlagsPostInit = PythonQt::RedirectStdOut;
  54. this->PythonManager.setInitializationFlags(flagsToSetPostInit);
  55. QCOMPARE(this->PythonManager.initializationFlags(), expectedFlagsPostInit);
  56. QCOMPARE(this->PythonManager.isPythonInitialized(), true);
  57. }
  58. // ----------------------------------------------------------------------------
  59. void ctkAbstractPythonManagerTester::testInitialize()
  60. {
  61. QVERIFY(this->PythonManager.initialize());
  62. }
  63. // ----------------------------------------------------------------------------
  64. void ctkAbstractPythonManagerTester::testMainContext()
  65. {
  66. QVERIFY(this->PythonManager.mainContext());
  67. }
  68. // ----------------------------------------------------------------------------
  69. void ctkAbstractPythonManagerTester::testPythonErrorOccured()
  70. {
  71. QFETCH(QString, pythonCode);
  72. QFETCH(bool, errorOccured);
  73. this->PythonManager.executeString(pythonCode);
  74. QCOMPARE(this->PythonManager.pythonErrorOccured(), errorOccured);
  75. }
  76. // ----------------------------------------------------------------------------
  77. void ctkAbstractPythonManagerTester::testPythonErrorOccured_data()
  78. {
  79. QTest::addColumn<QString>("pythonCode");
  80. QTest::addColumn<bool>("errorOccured");
  81. QTest::newRow("0") << QString("2 + 2") << false;
  82. QTest::newRow("1") << QString("raise Exception('This exception is expected')") << true;
  83. }
  84. // ----------------------------------------------------------------------------
  85. void ctkAbstractPythonManagerTester::testAddObjectToPythonMain()
  86. {
  87. QObject * object = new QObject(this);
  88. object->setProperty("happy", true);
  89. this->PythonManager.addObjectToPythonMain("testAddObjectToPythonMain", object);
  90. QVariant returnValue = this->PythonManager.executeString("testAddObjectToPythonMain.happy",
  91. ctkAbstractPythonManager::EvalInput);
  92. QCOMPARE(returnValue, QVariant(true));
  93. }
  94. // ----------------------------------------------------------------------------
  95. void ctkAbstractPythonManagerTester::testExecuteString()
  96. {
  97. QFETCH(QString, stringToExecute);
  98. QFETCH(int, executeStringMode);
  99. QFETCH(bool, errorOccured);
  100. QFETCH(QVariant, expectedReturnValue);
  101. QFETCH(QString, expectedVariableName);
  102. QFETCH(QVariant, expectedVariableValue);
  103. QVariant returnValue = this->PythonManager.executeString(
  104. stringToExecute,
  105. static_cast<ctkAbstractPythonManager::ExecuteStringMode>(executeStringMode));
  106. QCOMPARE(this->PythonManager.pythonErrorOccured(), errorOccured);
  107. if (errorOccured)
  108. {
  109. return;
  110. }
  111. QCOMPARE(returnValue, expectedReturnValue);
  112. QCOMPARE(this->PythonManager.getVariable(expectedVariableName), expectedVariableValue);
  113. }
  114. // ----------------------------------------------------------------------------
  115. void ctkAbstractPythonManagerTester::testExecuteString_data()
  116. {
  117. QTest::addColumn<QString>("stringToExecute");
  118. QTest::addColumn<int>("executeStringMode");
  119. QTest::addColumn<bool>("errorOccured");
  120. QTest::addColumn<QVariant>("expectedReturnValue");
  121. QTest::addColumn<QString>("expectedVariableName");
  122. QTest::addColumn<QVariant>("expectedVariableValue");
  123. QTest::newRow("0") << QString("a = 6542")
  124. << static_cast<int>(ctkAbstractPythonManager::FileInput)
  125. << false
  126. << QVariant() << QString("a") << QVariant(6542);
  127. QTest::newRow("1") << QString("6543")
  128. << static_cast<int>(ctkAbstractPythonManager::FileInput)
  129. << false
  130. << QVariant() << QString("a") << QVariant(6542);
  131. QTest::newRow("2") << QString("b = 6544")
  132. << static_cast<int>(ctkAbstractPythonManager::EvalInput)
  133. << true
  134. << QVariant() << QString("b") << QVariant();
  135. QTest::newRow("3") << QString("7")
  136. << static_cast<int>(ctkAbstractPythonManager::EvalInput)
  137. << false
  138. << QVariant(7) << QString("b") << QVariant();
  139. QTest::newRow("4") << QString("sys.getrecursionlimit()")
  140. << static_cast<int>(ctkAbstractPythonManager::FileInput)
  141. << false
  142. << QVariant() << QString() << QVariant();
  143. // This assume the default 'recursionlimit' has not been changed
  144. QTest::newRow("5") << QString("sys.getrecursionlimit()")
  145. << static_cast<int>(ctkAbstractPythonManager::EvalInput)
  146. << false
  147. << QVariant(1000) << QString() << QVariant();
  148. }
  149. // ----------------------------------------------------------------------------
  150. void ctkAbstractPythonManagerTester::testExecuteFile()
  151. {
  152. QFETCH(QString, stringToExecute);
  153. QFETCH(bool, pythonErrorExpected);
  154. QTemporaryFile pythonFile("testExecuteFile-XXXXXX.py");
  155. QVERIFY(pythonFile.open());
  156. QTextStream out(&pythonFile);
  157. out << stringToExecute;
  158. pythonFile.close();
  159. this->PythonManager.executeFile(pythonFile.fileName());
  160. QCOMPARE(this->PythonManager.pythonErrorOccured(), pythonErrorExpected);
  161. }
  162. // ----------------------------------------------------------------------------
  163. void ctkAbstractPythonManagerTester::testExecuteFile_data()
  164. {
  165. QTest::addColumn<QString>("stringToExecute");
  166. QTest::addColumn<bool>("pythonErrorExpected");
  167. QTest::newRow("0-emptyfile") << QString("")
  168. << false;
  169. QTest::newRow("1-helloworld") << QString("print 'Hello world'")
  170. << false;
  171. QTest::newRow("2-syntaxerror") << QString("print '") // SyntaxError
  172. << true;
  173. QTest::newRow("3-check __file__ attribute") << QString("print 'This file is: %s' % __file__")
  174. << false;
  175. }
  176. // ----------------------------------------------------------------------------
  177. CTK_TEST_MAIN(ctkAbstractPythonManagerTest)
  178. #include "moc_ctkAbstractPythonManagerTest.cpp"