ctkAbstractPythonManagerTest.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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 is 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(QVariant, expectedReturnValue);
  100. QFETCH(QString, expectedVariableName);
  101. QFETCH(QVariant, expectedVariableValue);
  102. QVariant returnValue = this->PythonManager.executeString(
  103. stringToExecute,
  104. static_cast<ctkAbstractPythonManager::ExecuteStringMode>(executeStringMode));
  105. QCOMPARE(returnValue, expectedReturnValue);
  106. QCOMPARE(this->PythonManager.getVariable(expectedVariableName), expectedVariableValue);
  107. }
  108. // ----------------------------------------------------------------------------
  109. void ctkAbstractPythonManagerTester::testExecuteString_data()
  110. {
  111. QTest::addColumn<QString>("stringToExecute");
  112. QTest::addColumn<int>("executeStringMode");
  113. QTest::addColumn<QVariant>("expectedReturnValue");
  114. QTest::addColumn<QString>("expectedVariableName");
  115. QTest::addColumn<QVariant>("expectedVariableValue");
  116. QTest::newRow("0") << QString("a = 6542")
  117. << static_cast<int>(ctkAbstractPythonManager::FileInput)
  118. << QVariant() << QString("a") << QVariant(6542);
  119. QTest::newRow("1") << QString("6543")
  120. << static_cast<int>(ctkAbstractPythonManager::FileInput)
  121. << QVariant() << QString("a") << QVariant(6542);
  122. QTest::newRow("2") << QString("b = 6544")
  123. << static_cast<int>(ctkAbstractPythonManager::EvalInput)
  124. << QVariant() << QString("b") << QVariant();
  125. QTest::newRow("3") << QString("7")
  126. << static_cast<int>(ctkAbstractPythonManager::EvalInput)
  127. << QVariant(7) << QString("b") << QVariant();
  128. }
  129. // ----------------------------------------------------------------------------
  130. void ctkAbstractPythonManagerTester::testExecuteFile()
  131. {
  132. QFETCH(QString, stringToExecute);
  133. QFETCH(bool, pythonErrorExpected);
  134. QTemporaryFile pythonFile("testExecuteFile-XXXXXX.py");
  135. QVERIFY(pythonFile.open());
  136. QTextStream out(&pythonFile);
  137. out << stringToExecute;
  138. pythonFile.close();
  139. this->PythonManager.executeFile(pythonFile.fileName());
  140. QCOMPARE(this->PythonManager.pythonErrorOccured(), pythonErrorExpected);
  141. }
  142. // ----------------------------------------------------------------------------
  143. void ctkAbstractPythonManagerTester::testExecuteFile_data()
  144. {
  145. QTest::addColumn<QString>("stringToExecute");
  146. QTest::addColumn<bool>("pythonErrorExpected");
  147. QTest::newRow("0-emptyfile") << QString("")
  148. << false;
  149. QTest::newRow("1-helloworld") << QString("print 'Hello world'")
  150. << false;
  151. QTest::newRow("2-syntaxerror") << QString("print '") // SyntaxError
  152. << true;
  153. QTest::newRow("3-check __file__ attribute") << QString("print 'This file is: %s' % __file__")
  154. << false;
  155. }
  156. // ----------------------------------------------------------------------------
  157. CTK_TEST_MAIN(ctkAbstractPythonManagerTest)
  158. #include "moc_ctkAbstractPythonManagerTest.cpp"