2022-09-26 14:20:51 -04:00
|
|
|
# Copyright 2022 (c) Anna Schumaker.
|
|
|
|
"""Tests our Factory implementation."""
|
|
|
|
import unittest
|
|
|
|
import unittest.mock
|
|
|
|
import emmental.factory
|
2022-10-17 15:24:12 -04:00
|
|
|
from gi.repository import Gio
|
2022-09-26 14:20:51 -04:00
|
|
|
from gi.repository import Gtk
|
|
|
|
from gi.repository import GObject
|
|
|
|
|
|
|
|
|
|
|
|
class TestListRow(unittest.TestCase):
|
|
|
|
"""Test the ListRow object."""
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
"""Set up common variables."""
|
|
|
|
self.item = Gtk.Label(label="Test")
|
|
|
|
self.listitem = Gtk.ListItem()
|
|
|
|
self.listitem.get_item = unittest.mock.Mock(return_value=self.item)
|
|
|
|
|
|
|
|
self.row = emmental.factory.ListRow(self.listitem, child=Gtk.Label())
|
|
|
|
self.row.do_bind = unittest.mock.Mock(wraps=self.row.do_bind)
|
|
|
|
self.row.do_unbind = unittest.mock.Mock(wraps=self.row.do_unbind)
|
|
|
|
|
|
|
|
def test_init(self):
|
|
|
|
"""Test that the ListRow is set up properly."""
|
|
|
|
self.assertIsInstance(self.row, GObject.GObject)
|
|
|
|
self.assertIsInstance(self.listitem.get_child(), Gtk.Label)
|
|
|
|
|
|
|
|
self.assertListEqual(self.row.bindings, [])
|
|
|
|
self.assertEqual(self.row.listitem, self.listitem)
|
|
|
|
self.assertEqual(self.row.child, self.listitem.get_child())
|
|
|
|
self.assertEqual(self.row.item, self.item)
|
2022-10-17 15:45:30 -04:00
|
|
|
self.assertFalse(self.row.active)
|
2022-09-26 14:20:51 -04:00
|
|
|
|
|
|
|
def test_bind(self):
|
|
|
|
"""Test calling bind() on the ListRow."""
|
|
|
|
self.row.bind()
|
|
|
|
self.row.do_bind.assert_called()
|
|
|
|
|
2022-10-17 15:45:30 -04:00
|
|
|
def test_bind_active(self):
|
|
|
|
"""Test binding a property to the Row's active property."""
|
|
|
|
parent = Gtk.Box()
|
|
|
|
parent.append(self.row.child)
|
|
|
|
|
|
|
|
self.row.bind_active("sensitive")
|
|
|
|
self.assertEqual(len(self.row.bindings), 1)
|
|
|
|
self.assertTrue(parent.get_state_flags() & Gtk.StateFlags.CHECKED)
|
|
|
|
self.assertTrue(self.row.active)
|
|
|
|
|
|
|
|
self.item.set_sensitive(False)
|
|
|
|
self.assertFalse(parent.get_state_flags() & Gtk.StateFlags.CHECKED)
|
|
|
|
self.assertFalse(self.row.active)
|
|
|
|
|
2022-09-26 14:20:51 -04:00
|
|
|
def test_bind_and_set_property(self):
|
|
|
|
"""Test the ListRow bind_property() function."""
|
|
|
|
self.row.bind_and_set_property("label", "label")
|
|
|
|
self.assertEqual(self.row.child.get_text(), "Test")
|
|
|
|
self.assertEqual(len(self.row.bindings), 1)
|
|
|
|
self.assertIsInstance(self.row.bindings[0], GObject.Binding)
|
|
|
|
|
|
|
|
self.item.set_text("Text 2")
|
|
|
|
self.assertEqual(self.row.child.get_text(), "Text 2")
|
|
|
|
|
|
|
|
self.row.child.set_text("Other Text")
|
|
|
|
self.assertEqual(self.item.get_text(), "Text 2")
|
|
|
|
|
|
|
|
def test_bind_bidirectional(self):
|
|
|
|
"""Test bidirectional bindings."""
|
|
|
|
self.row.bind_and_set_property("label", "label", bidirectional=True)
|
|
|
|
self.assertEqual(self.row.child.get_text(), "Test")
|
|
|
|
self.row.child.set_text("Other Text")
|
|
|
|
self.assertEqual(self.item.get_text(), "Other Text")
|
|
|
|
|
|
|
|
def test_bind_invert_boolean(self):
|
|
|
|
"""Test invert boolean bindings."""
|
|
|
|
self.row.bind_and_set_property("sensitive", "sensitive",
|
|
|
|
invert_boolean=True)
|
|
|
|
self.assertFalse(self.row.child.get_sensitive())
|
|
|
|
self.item.set_sensitive(False)
|
|
|
|
self.assertTrue(self.row.child.get_sensitive())
|
|
|
|
|
|
|
|
def test_unbind(self):
|
|
|
|
"""Test unbinding a ListRow."""
|
|
|
|
self.row.unbind()
|
|
|
|
self.row.do_unbind.assert_called()
|
|
|
|
self.assertEqual(len(self.row.bindings), 0)
|
|
|
|
|
|
|
|
|
2022-09-26 14:20:51 -04:00
|
|
|
class TestInscriptionRow(unittest.TestCase):
|
|
|
|
"""Test our pre-configured InscriptionRow."""
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
"""Set up common variables."""
|
|
|
|
self.item = Gtk.Inscription(text="Test")
|
|
|
|
self.listitem = Gtk.ListItem()
|
|
|
|
self.listitem.get_item = unittest.mock.Mock(return_value=self.item)
|
|
|
|
|
|
|
|
def test_inscription_row(self):
|
|
|
|
"""Test that the LabelRow works as expected."""
|
|
|
|
row = emmental.factory.InscriptionRow(self.listitem,
|
|
|
|
item_property="text")
|
|
|
|
self.assertIsInstance(row, emmental.factory.ListRow)
|
|
|
|
self.assertIsInstance(row.child, Gtk.Inscription)
|
|
|
|
|
|
|
|
self.assertEqual(row.item_property, "text")
|
|
|
|
self.assertEqual(row.child.get_xalign(), 0.0)
|
|
|
|
self.assertFalse(row.child.has_css_class("numeric"))
|
|
|
|
|
|
|
|
row.bind()
|
|
|
|
self.assertEqual(row.child.get_text(), "Test")
|
|
|
|
|
|
|
|
def test_numeric_inscription(self):
|
|
|
|
"""Test that we can create numeric Labels."""
|
|
|
|
row = emmental.factory.InscriptionRow(self.listitem,
|
|
|
|
item_property="text",
|
|
|
|
xalign=1.0, numeric=True)
|
|
|
|
self.assertEqual(row.child.get_xalign(), 1.0)
|
|
|
|
self.assertTrue(row.child.has_css_class("numeric"))
|
|
|
|
|
|
|
|
|
2022-10-17 15:24:12 -04:00
|
|
|
class TestTreeRow(unittest.TestCase):
|
|
|
|
"""Test our pre-configured TreeRow."""
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
"""Set up common variables."""
|
|
|
|
self.item = Gtk.Label(label="Test")
|
|
|
|
self.child = Gtk.Label()
|
|
|
|
|
|
|
|
self.treerow = Gtk.TreeListRow()
|
|
|
|
self.treerow.get_item = unittest.mock.Mock(return_value=self.item)
|
|
|
|
|
|
|
|
self.listitem = Gtk.ListItem()
|
|
|
|
self.listitem.get_item = unittest.mock.Mock(return_value=self.treerow)
|
|
|
|
self.row = emmental.factory.TreeRow(self.listitem)
|
|
|
|
|
|
|
|
def test_tree_row(self):
|
|
|
|
"""Test that the TreeRow works as expected."""
|
|
|
|
self.assertIsInstance(self.row, emmental.factory.ListRow)
|
|
|
|
self.assertIsInstance(self.listitem.get_child(), Gtk.TreeExpander)
|
|
|
|
self.assertEqual(self.row.item, self.item)
|
|
|
|
|
|
|
|
self.row.child = self.child
|
|
|
|
self.assertEqual(self.listitem.get_child().get_child(), self.child)
|
|
|
|
self.assertEqual(self.row.child, self.child)
|
|
|
|
|
|
|
|
self.row.bind()
|
|
|
|
self.assertEqual(self.listitem.get_child().get_list_row(),
|
|
|
|
self.treerow)
|
|
|
|
self.row.unbind()
|
|
|
|
self.assertIsNone(self.listitem.get_child().get_list_row())
|
|
|
|
|
|
|
|
def test_indented(self):
|
|
|
|
"""Test the indended property."""
|
|
|
|
self.assertTrue(self.row.indented)
|
|
|
|
self.assertTrue(self.listitem.get_child().get_indent_for_icon())
|
|
|
|
|
|
|
|
self.row.indented = False
|
|
|
|
self.assertFalse(self.listitem.get_child().get_indent_for_icon())
|
|
|
|
|
|
|
|
row2 = emmental.factory.TreeRow(self.listitem, indented=False)
|
|
|
|
self.assertFalse(row2.indented)
|
|
|
|
self.assertFalse(self.listitem.get_child().get_indent_for_icon())
|
|
|
|
|
|
|
|
def test_bind_n_children(self):
|
|
|
|
"""Test binding to the n_children property."""
|
|
|
|
expander = self.listitem.get_child()
|
|
|
|
liststore = Gio.ListStore()
|
|
|
|
|
|
|
|
self.assertEqual(self.row.n_children, 0)
|
|
|
|
self.assertFalse(self.row.have_children)
|
|
|
|
self.assertTrue(expander.get_hide_expander())
|
|
|
|
|
|
|
|
self.row.n_children = 1
|
|
|
|
self.assertTrue(self.row.have_children)
|
|
|
|
self.assertFalse(expander.get_hide_expander())
|
|
|
|
|
|
|
|
self.row.bind_n_children(None)
|
|
|
|
self.assertEqual(len(self.row.bindings), 0)
|
|
|
|
|
|
|
|
self.row.bind_n_children(liststore)
|
|
|
|
self.assertEqual(self.row.n_children, 0)
|
|
|
|
self.assertTrue(expander.get_hide_expander())
|
|
|
|
|
|
|
|
liststore.append(Gtk.Label())
|
|
|
|
self.assertEqual(self.row.n_children, 1)
|
|
|
|
self.assertFalse(expander.get_hide_expander())
|
|
|
|
|
|
|
|
|
2022-09-26 14:20:51 -04:00
|
|
|
class TestFactory(unittest.TestCase):
|
|
|
|
"""Test a Factory."""
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
"""Set up common variables."""
|
|
|
|
self.item = Gtk.Label(label="Text")
|
|
|
|
self.listitem = Gtk.ListItem()
|
|
|
|
self.listitem.get_item = unittest.mock.Mock(return_value=self.item)
|
|
|
|
self.factory = emmental.factory.Factory(
|
|
|
|
row_type=emmental.factory.ListRow)
|
|
|
|
|
|
|
|
def test_init(self):
|
|
|
|
"""Test that the ListFactory is set up properly."""
|
|
|
|
self.assertIsInstance(self.factory, Gtk.SignalListItemFactory)
|
|
|
|
self.assertEqual(self.factory.row_type, emmental.factory.ListRow)
|
|
|
|
|
|
|
|
def test_setup(self):
|
|
|
|
"""Test the setup signal."""
|
|
|
|
self.factory.emit("setup", self.listitem)
|
|
|
|
self.assertIsInstance(self.listitem.listrow,
|
|
|
|
emmental.factory.ListRow)
|
|
|
|
|
|
|
|
def test_bind(self):
|
|
|
|
"""Test the bind signal."""
|
|
|
|
self.factory.emit("setup", self.listitem)
|
|
|
|
self.listitem.listrow.bind = unittest.mock.Mock()
|
|
|
|
self.factory.emit("bind", self.listitem)
|
|
|
|
self.listitem.listrow.bind.assert_called()
|
|
|
|
|
|
|
|
def test_unbind(self):
|
|
|
|
"""Test the unbind signal."""
|
|
|
|
self.factory.emit("setup", self.listitem)
|
|
|
|
self.listitem.listrow.unbind = unittest.mock.Mock()
|
|
|
|
self.factory.emit("unbind", self.listitem)
|
|
|
|
self.listitem.listrow.unbind.assert_called()
|
|
|
|
|
|
|
|
def test_teardown(self):
|
|
|
|
"""Test the teardown signal."""
|
|
|
|
self.factory.emit("setup", self.listitem)
|
|
|
|
self.factory.emit("teardown", self.listitem)
|
|
|
|
self.assertIsNone(self.listitem.get_child())
|
|
|
|
self.assertIsNone(self.listitem.listrow)
|
2022-09-26 14:20:51 -04:00
|
|
|
|
|
|
|
|
|
|
|
class TestInscriptionFactory(unittest.TestCase):
|
|
|
|
"""Test an Inscription Factory."""
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
"""Set up common variables."""
|
|
|
|
self.item = Gtk.Inscription(text="Text")
|
|
|
|
self.listitem = Gtk.ListItem()
|
|
|
|
self.listitem.get_item = unittest.mock.Mock(return_value=self.item)
|
|
|
|
|
|
|
|
def test_init(self):
|
|
|
|
"""Test a basic LabelFactory."""
|
|
|
|
factory = emmental.factory.InscriptionFactory(item_property="text",
|
|
|
|
xalign=1.0, numeric=True)
|
|
|
|
self.assertIsInstance(factory, emmental.factory.Factory)
|
|
|
|
self.assertEqual(factory.row_type, emmental.factory.InscriptionRow)
|
|
|
|
|
|
|
|
factory.emit("setup", self.listitem)
|
|
|
|
self.assertIsInstance(self.listitem.listrow,
|
|
|
|
emmental.factory.InscriptionRow)
|
|
|
|
self.assertEqual(self.listitem.get_child().get_xalign(), 1.0)
|
|
|
|
self.assertTrue(self.listitem.get_child().has_css_class("numeric"))
|
|
|
|
|
|
|
|
def test_script_type(self):
|
|
|
|
"""Test a LabelFactory that makes other types of LabelRows."""
|
|
|
|
factory = emmental.factory.InscriptionFactory(
|
|
|
|
script_type=Gtk.EditableLabel, item_property="label")
|
|
|
|
self.assertEqual(factory.row_type, Gtk.EditableLabel)
|