test_completion_widget.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import tempfile
  4. import shutil
  5. import unittest
  6. import pytest
  7. from qtpy import QtCore, QtWidgets
  8. from qtpy.QtTest import QTest
  9. from qtconsole.console_widget import ConsoleWidget
  10. from qtconsole.completion_widget import CompletionWidget
  11. from . import no_display
  12. class TemporaryDirectory(object):
  13. """
  14. Context manager for tempfile.mkdtemp().
  15. This class is available in python +v3.2.
  16. See: https://gist.github.com/cpelley/10e2eeaf60dacc7956bb
  17. """
  18. def __enter__(self):
  19. self.dir_name = tempfile.mkdtemp()
  20. return self.dir_name
  21. def __exit__(self, exc_type, exc_value, traceback):
  22. shutil.rmtree(self.dir_name)
  23. TemporaryDirectory = getattr(tempfile, 'TemporaryDirectory',
  24. TemporaryDirectory)
  25. @pytest.mark.skipif(no_display, reason="Doesn't work without a display")
  26. class TestCompletionWidget(unittest.TestCase):
  27. @classmethod
  28. def setUpClass(cls):
  29. """ Create the application for the test case.
  30. """
  31. cls._app = QtWidgets.QApplication.instance()
  32. if cls._app is None:
  33. cls._app = QtWidgets.QApplication([])
  34. cls._app.setQuitOnLastWindowClosed(False)
  35. @classmethod
  36. def tearDownClass(cls):
  37. """ Exit the application.
  38. """
  39. QtWidgets.QApplication.quit()
  40. def setUp(self):
  41. """ Create the main widgets (ConsoleWidget)
  42. """
  43. self.console = ConsoleWidget()
  44. self.text_edit = self.console._control
  45. def test_droplist_completer_shows(self):
  46. w = CompletionWidget(self.console)
  47. w.show_items(self.text_edit.textCursor(), ["item1", "item2", "item3"])
  48. self.assertTrue(w.isVisible())
  49. def test_droplist_completer_keyboard(self):
  50. w = CompletionWidget(self.console)
  51. w.show_items(self.text_edit.textCursor(), ["item1", "item2", "item3"])
  52. QTest.keyClick(w, QtCore.Qt.Key_PageDown)
  53. QTest.keyClick(w, QtCore.Qt.Key_Enter)
  54. self.assertEqual(self.text_edit.toPlainText(), "item3")
  55. def test_droplist_completer_mousepick(self):
  56. leftButton = QtCore.Qt.LeftButton
  57. w = CompletionWidget(self.console)
  58. w.show_items(self.text_edit.textCursor(), ["item1", "item2", "item3"])
  59. QTest.mouseClick(w.viewport(), leftButton, pos=QtCore.QPoint(19, 8))
  60. QTest.mouseRelease(w.viewport(), leftButton, pos=QtCore.QPoint(19, 8))
  61. QTest.mouseDClick(w.viewport(), leftButton, pos=QtCore.QPoint(19, 8))
  62. self.assertEqual(self.text_edit.toPlainText(), "item1")
  63. self.assertFalse(w.isVisible())
  64. def test_common_path_complete(self):
  65. with TemporaryDirectory() as tmpdir:
  66. items = [
  67. os.path.join(tmpdir, "common/common1/item1"),
  68. os.path.join(tmpdir, "common/common1/item2"),
  69. os.path.join(tmpdir, "common/common1/item3")]
  70. for item in items:
  71. os.makedirs(item)
  72. w = CompletionWidget(self.console)
  73. w.show_items(self.text_edit.textCursor(), items)
  74. self.assertEqual(w.currentItem().text(), '/item1')
  75. QTest.keyClick(w, QtCore.Qt.Key_Down)
  76. self.assertEqual(w.currentItem().text(), '/item2')
  77. QTest.keyClick(w, QtCore.Qt.Key_Down)
  78. self.assertEqual(w.currentItem().text(), '/item3')