test_backend_gtk3.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import os
  2. from matplotlib import pyplot as plt
  3. import pytest
  4. from unittest import mock
  5. @pytest.mark.backend("gtk3agg", skip_on_importerror=True)
  6. def test_correct_key():
  7. pytest.xfail("test_widget_send_event is not triggering key_press_event")
  8. from gi.repository import Gdk, Gtk # type: ignore[import]
  9. fig = plt.figure()
  10. buf = []
  11. def send(event):
  12. for key, mod in [
  13. (Gdk.KEY_a, Gdk.ModifierType.SHIFT_MASK),
  14. (Gdk.KEY_a, 0),
  15. (Gdk.KEY_a, Gdk.ModifierType.CONTROL_MASK),
  16. (Gdk.KEY_agrave, 0),
  17. (Gdk.KEY_Control_L, Gdk.ModifierType.MOD1_MASK),
  18. (Gdk.KEY_Alt_L, Gdk.ModifierType.CONTROL_MASK),
  19. (Gdk.KEY_agrave,
  20. Gdk.ModifierType.CONTROL_MASK
  21. | Gdk.ModifierType.MOD1_MASK
  22. | Gdk.ModifierType.MOD4_MASK),
  23. (0xfd16, 0), # KEY_3270_Play.
  24. (Gdk.KEY_BackSpace, 0),
  25. (Gdk.KEY_BackSpace, Gdk.ModifierType.CONTROL_MASK),
  26. ]:
  27. # This is not actually really the right API: it depends on the
  28. # actual keymap (e.g. on Azerty, shift+agrave -> 0).
  29. Gtk.test_widget_send_key(fig.canvas, key, mod)
  30. def receive(event):
  31. buf.append(event.key)
  32. if buf == [
  33. "A", "a", "ctrl+a",
  34. "\N{LATIN SMALL LETTER A WITH GRAVE}",
  35. "alt+control", "ctrl+alt",
  36. "ctrl+alt+super+\N{LATIN SMALL LETTER A WITH GRAVE}",
  37. # (No entry for KEY_3270_Play.)
  38. "backspace", "ctrl+backspace",
  39. ]:
  40. plt.close(fig)
  41. fig.canvas.mpl_connect("draw_event", send)
  42. fig.canvas.mpl_connect("key_press_event", receive)
  43. plt.show()
  44. @pytest.mark.backend("gtk3agg", skip_on_importerror=True)
  45. def test_save_figure_return():
  46. from gi.repository import Gtk
  47. fig, ax = plt.subplots()
  48. ax.imshow([[1]])
  49. with mock.patch("gi.repository.Gtk.FileFilter") as fileFilter:
  50. filt = fileFilter.return_value
  51. filt.get_name.return_value = "Portable Network Graphics"
  52. with mock.patch("gi.repository.Gtk.FileChooserDialog") as dialogChooser:
  53. dialog = dialogChooser.return_value
  54. dialog.get_filter.return_value = filt
  55. dialog.get_filename.return_value = "foobar.png"
  56. dialog.run.return_value = Gtk.ResponseType.OK
  57. fname = fig.canvas.manager.toolbar.save_figure()
  58. os.remove("foobar.png")
  59. assert fname == "foobar.png"
  60. with mock.patch("gi.repository.Gtk.MessageDialog"):
  61. dialog.get_filename.return_value = None
  62. dialog.run.return_value = Gtk.ResponseType.OK
  63. fname = fig.canvas.manager.toolbar.save_figure()
  64. assert fname is None