emmental/tests/test_buttons.py
Anna Schumaker eb6b4d8ef4 buttons: Watch for ImageToggle tooltip text changes
If the application changes the active or inactive tooltip text, then we
want to apply that to the button depending on what state it currently
has.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2023-08-22 13:29:53 -04:00

240 lines
9.2 KiB
Python

# Copyright 2022 (c) Anna Schumaker.
"""Test our button helper classes."""
import unittest
import unittest.mock
import emmental.buttons
from gi.repository import Gtk
class TestButton(unittest.TestCase):
"""Test a Button."""
def setUp(self):
"""Set up common variables."""
self.button = emmental.buttons.Button()
def test_init(self):
"""Test that the button is configured correctly."""
self.assertIsInstance(self.button, Gtk.Button)
self.assertIsInstance(self.button._image, Gtk.Image)
self.assertEqual(self.button.get_child(), self.button._image)
self.assertFalse(self.button.get_focusable())
def test_icon_name(self):
"""Test the icon-name property."""
self.assertEqual(self.button.icon_name, "")
self.button.icon_name = "icon-name"
self.assertEqual(self.button._image.get_icon_name(), "icon-name")
button2 = emmental.buttons.Button(icon_name="icon-name")
self.assertEqual(button2.icon_name, "icon-name")
self.assertEqual(button2._image.get_icon_name(), "icon-name")
def test_icon_opacity(self):
"""Test the icon-opacity property."""
self.assertEqual(self.button.icon_opacity, 1.0)
self.button.icon_opacity = 0.5
self.assertAlmostEqual(self.button._image.get_opacity(),
0.5, delta=0.005)
button2 = emmental.buttons.Button(icon_opacity=0.25)
self.assertAlmostEqual(button2.icon_opacity, 0.25, delta=0.005)
self.assertAlmostEqual(button2._image.get_opacity(), 0.25, delta=0.005)
def test_large_icon(self):
"""Test the large-icon property."""
self.assertFalse(self.button.large_icon)
self.assertEqual(self.button._image.get_icon_size(),
Gtk.IconSize.NORMAL)
self.button.large_icon = True
self.assertEqual(self.button._image.get_icon_size(),
Gtk.IconSize.LARGE)
button2 = emmental.buttons.Button(large_icon=True)
self.assertTrue(button2.large_icon)
self.assertEqual(button2._image.get_icon_size(), Gtk.IconSize.LARGE)
class TestPopoverButton(unittest.TestCase):
"""Test a Popover Button."""
def setUp(self):
"""Set up common variables."""
self.button = emmental.buttons.PopoverButton()
def test_button(self):
"""Test that the popover button is configured correctly."""
self.assertIsInstance(self.button, Gtk.MenuButton)
self.assertIsInstance(self.button.get_popover(), Gtk.Popover)
def test_popover_child(self):
"""Test setting a child widget to the popover button."""
self.assertIsNone(self.button.popover_child)
self.button.popover_child = Gtk.Label()
self.assertEqual(self.button.get_popover().get_child(),
self.button.popover_child)
button2 = emmental.buttons.PopoverButton(popover_child=Gtk.Label())
self.assertIsInstance(button2.popover_child, Gtk.Label)
self.assertEqual(button2.get_popover().get_child(),
button2.popover_child)
def test_popdown(self):
"""Test the popdown() function."""
self.button.popdown()
class TestSplitButton(unittest.TestCase):
"""Test a Split Button."""
def setUp(self):
"""Set up common variables."""
self.secondary = Gtk.Button()
self.button = emmental.buttons.SplitButton(secondary=self.secondary)
def test_button(self):
"""Test that the split button is configured correctly."""
self.assertIsInstance(self.button, Gtk.Box)
self.assertIsInstance(self.button._primary, emmental.buttons.Button)
self.assertIsInstance(self.button._separator, Gtk.Separator)
self.assertEqual(self.button._secondary, self.secondary)
self.assertTrue(self.button._primary.get_hexpand())
self.assertEqual(self.button._separator.get_orientation(),
Gtk.Orientation.VERTICAL)
self.assertEqual(self.button._separator.get_margin_top(), 12)
self.assertEqual(self.button._separator.get_margin_bottom(), 12)
self.assertEqual(self.button.get_first_child(), self.button._primary)
self.assertEqual(self.button._primary.get_next_sibling(),
self.button._separator)
self.assertEqual(self.button._separator.get_next_sibling(),
self.secondary)
self.assertTrue(self.button.has_css_class("emmental-splitbutton"))
def test_icon_name(self):
"""Test the icon name property."""
self.assertEqual(self.button.icon_name, "")
self.button.icon_name = "icon-name"
self.assertEqual(self.button._primary.icon_name, "icon-name")
button2 = emmental.buttons.SplitButton(icon_name="icon-name",
secondary=Gtk.Button())
self.assertEqual(button2.icon_name, "icon-name")
self.assertEqual(button2._primary.icon_name, "icon-name")
def test_large_icon(self):
"""Test the large icon property."""
self.assertFalse(self.button.large_icon)
self.button.large_icon = True
self.assertTrue(self.button._primary.large_icon)
button2 = emmental.buttons.SplitButton(large_icon=True,
secondary=Gtk.Button())
self.assertTrue(button2.large_icon)
self.assertTrue(button2._primary.large_icon)
def test_secondary(self):
"""Test the secondary property."""
self.assertEqual(self.button.secondary, self.secondary)
with self.assertRaises(TypeError):
self.button.secondary = Gtk.Button()
self.assertEqual(self.button.secondary, self.secondary)
def test_clicked(self):
"""Test the clicked signal."""
on_click = unittest.mock.Mock()
self.button.connect("clicked", on_click)
self.button._primary.emit("clicked")
on_click.assert_called_with(self.button)
def test_activate(self):
"""Test the activate function."""
activate = unittest.mock.Mock()
primary = unittest.mock.Mock()
self.button.connect("activate-primary", primary)
self.button._primary.connect("activate", activate)
self.button.activate()
activate.assert_called()
primary.assert_called()
class TestImageToggle(unittest.TestCase):
"""Test an ImageToggle button."""
def setUp(self):
"""Set up common variables."""
self.button = emmental.buttons.ImageToggle("active", "inactive")
def test_init(self):
"""Test that the ImageToggle button is configured correctly."""
self.assertIsInstance(self.button, emmental.buttons.Button)
self.assertEqual(self.button.active_icon_name, "active")
self.assertEqual(self.button.inactive_icon_name, "inactive")
self.assertEqual(self.button.icon_name, "inactive")
self.assertFalse(self.button.active)
def test_active(self):
"""Test the active property."""
self.button.active = True
self.assertTrue(self.button.active)
self.assertEqual(self.button.icon_name, "active")
self.button.active = False
self.assertFalse(self.button.active)
self.assertEqual(self.button.icon_name, "inactive")
button2 = emmental.buttons.ImageToggle("active", "inactive",
active=True)
self.assertTrue(button2.active)
def test_tooltip_text(self):
"""Test the active and inactive tooltip text."""
self.assertEqual(self.button.active_tooltip_text, None)
self.assertEqual(self.button.inactive_tooltip_text, None)
button2 = emmental.buttons.ImageToggle("active", "inactive",
"active tooltip text",
"inactive tooltip text")
self.assertEqual(button2.active_tooltip_text, "active tooltip text")
self.assertEqual(button2.inactive_tooltip_text,
"inactive tooltip text")
self.assertEqual(button2.get_tooltip_text(), "inactive tooltip text")
button2.active = True
self.assertEqual(button2.get_tooltip_text(), "active tooltip text")
button2.active = False
self.assertEqual(button2.get_tooltip_text(), "inactive tooltip text")
def test_changing_tooltip_text(self):
"""Test changing the tooltip text for the current state."""
self.assertEqual(self.button.props.tooltip_text, None)
self.button.inactive_tooltip_text = "inactive tooltip"
self.assertEqual(self.button.props.tooltip_text, "inactive tooltip")
self.button.active = True
self.assertEqual(self.button.props.tooltip_text, None)
self.button.active_tooltip_text = "active tooltip"
self.assertEqual(self.button.props.tooltip_text, "active tooltip")
def test_toggle(self):
"""Test the toggle signal."""
toggled = unittest.mock.Mock()
self.button.connect("toggled", toggled)
self.button.active = False
toggled.assert_not_called()
self.button.active = True
toggled.assert_called()
toggled.reset_mock()
self.button.emit("clicked")
self.assertFalse(self.button.active)
toggled.assert_called()