Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
giswqs
GitHub Repository: giswqs/geemap
Path: blob/master/tests/test_toolbar.py
2313 views
1
#!/usr/bin/env python
2
"""Tests for `map_widgets` module."""
3
4
import dataclasses
5
import unittest
6
7
import geemap
8
from geemap import toolbar
9
10
11
class TestToolbar(unittest.TestCase):
12
"""Tests for the Toolbar class in the `toolbar` module."""
13
14
callback_calls: int
15
last_called_with_selected: bool | None
16
last_called_item: toolbar.ToolbarItem | None
17
item: toolbar.ToolbarItem
18
reset_item: toolbar.ToolbarItem
19
20
def setUp(self):
21
super().setUp()
22
self.callback_calls = 0
23
self.last_called_with_selected = None
24
self.last_called_item = None
25
self.item = toolbar.ToolbarItem(
26
icon="info", tooltip="dummy item", callback=self.dummy_callback
27
)
28
self.reset_item = toolbar.ToolbarItem(
29
icon="question",
30
tooltip="no reset item",
31
callback=self.dummy_callback,
32
reset=True,
33
)
34
35
def dummy_callback(self, m, selected, item):
36
del m # Unused.
37
self.last_called_with_selected = selected
38
self.last_called_item = item
39
self.callback_calls += 1
40
41
def test_no_tools_throws(self):
42
a_map = geemap.Map(ee_initialize=False)
43
self.assertRaises(ValueError, toolbar.Toolbar, a_map, [], [])
44
45
def test_only_main_tools_exist_if_no_extra_tools(self):
46
a_map = geemap.Map(ee_initialize=False)
47
a_toolboor = toolbar.Toolbar(a_map, [self.item], [])
48
self.assertNotIn(a_toolboor.toggle_widget, a_toolboor.main_tools)
49
50
def test_all_tools_and_toggle_exist_if_extra_tools(self):
51
a_map = geemap.Map(ee_initialize=False)
52
a_toolboor = toolbar.Toolbar(a_map, [self.item], [self.reset_item])
53
self.assertIsNotNone(a_toolboor.toggle_widget)
54
55
def test_toggle_expands_and_collapses(self):
56
"""Toggle widget correctly expands and collapses the toolbar."""
57
a_map = geemap.Map(ee_initialize=False)
58
a_toolboor = toolbar.Toolbar(a_map, [self.item], [self.reset_item])
59
self.assertIsNotNone(a_toolboor.toggle_widget)
60
toggle = a_toolboor.toggle_widget
61
self.assertEqual(toggle.icon, "add")
62
self.assertEqual(toggle.tooltip_text, "Expand toolbar")
63
self.assertFalse(a_toolboor.expanded)
64
65
# Expand
66
toggle.active = True
67
self.assertTrue(a_toolboor.expanded)
68
self.assertEqual(toggle.icon, "remove")
69
self.assertEqual(toggle.tooltip_text, "Collapse toolbar")
70
# After expanding, button is unselected.
71
self.assertFalse(toggle.active)
72
73
# Collapse
74
toggle.active = True
75
self.assertFalse(a_toolboor.expanded)
76
self.assertEqual(toggle.icon, "add")
77
self.assertEqual(toggle.tooltip_text, "Expand toolbar")
78
# After collapsing, button is unselected.
79
self.assertFalse(toggle.active)
80
81
def test_triggers_callbacks(self):
82
"""Tests that toolbar item callbacks are triggered correctly."""
83
a_map = geemap.Map(ee_initialize=False)
84
a_toolboor = toolbar.Toolbar(a_map, [self.item, self.reset_item], [])
85
self.assertIsNone(self.last_called_with_selected)
86
self.assertIsNone(self.last_called_item)
87
88
# Select first tool, which does not reset.
89
a_toolboor.main_tools[0].active = True
90
self.assertTrue(self.last_called_with_selected)
91
self.assertEqual(self.callback_calls, 1)
92
self.assertTrue(a_toolboor.main_tools[0].active)
93
self.assertEqual(self.item, self.last_called_item)
94
95
# Select second tool, which resets.
96
a_toolboor.main_tools[1].active = True
97
# Was reset by callback.
98
self.assertFalse(self.last_called_with_selected)
99
self.assertEqual(self.callback_calls, 3)
100
self.assertFalse(a_toolboor.main_tools[1].active)
101
self.assertEqual(self.reset_item, self.last_called_item)
102
103
@dataclasses.dataclass
104
class TestWidget:
105
selected_count: int = 0
106
cleanup_count: int = 0
107
108
def cleanup(self):
109
self.cleanup_count += 1
110
111
def test_cleanup_toolbar_item_decorator(self):
112
"""Tests the _cleanup_toolbar_item decorator functionality."""
113
widget = TestToolbar.TestWidget()
114
115
# pylint: disable-next=protected-access
116
@toolbar._cleanup_toolbar_item
117
def callback(m, selected, item):
118
del m, selected, item # Unused.
119
widget.selected_count += 1
120
return widget
121
122
item = toolbar.ToolbarItem(
123
icon="info", tooltip="dummy item", callback=callback, reset=False
124
)
125
a_map = geemap.Map(ee_initialize=False)
126
a_toolboor = toolbar.Toolbar(a_map, [item], [])
127
a_toolboor.main_tools[0].active = True
128
self.assertEqual(1, widget.selected_count)
129
self.assertEqual(0, widget.cleanup_count)
130
131
a_toolboor.main_tools[0].active = False
132
self.assertEqual(1, widget.selected_count)
133
self.assertEqual(1, widget.cleanup_count)
134
135
a_toolboor.main_tools[0].active = True
136
self.assertEqual(2, widget.selected_count)
137
self.assertEqual(1, widget.cleanup_count)
138
139
widget.cleanup()
140
self.assertEqual(2, widget.selected_count)
141
self.assertEqual(3, widget.cleanup_count)
142
self.assertFalse(a_toolboor.main_tools[0].active)
143
144
145
if __name__ == "__main__":
146
unittest.main()
147
148