6 from gi.repository import GLib, GObject
7 from gi import PyGIDeprecationWarning
10 class Idle(GLib.Idle):
11 def __init__(self, loop):
12 GLib.Idle.__init__(self)
14 self.set_callback(self.callback, loop)
16 def callback(self, loop):
21 class MySource(GLib.Source):
23 GLib.Source.__init__(self)
31 def dispatch(self, callback, args):
32 return callback(*args)
35 class TestSource(unittest.TestCase):
36 def timeout_callback(self, loop):
39 def my_callback(self, loop):
43 def setup_timeout(self, loop):
44 timeout = GLib.Timeout(500)
45 timeout.set_callback(self.timeout_callback, loop)
48 def test_sources(self):
49 loop = GLib.MainLoop()
51 self.setup_timeout(loop)
54 self.assertEqual(idle.get_context(), None)
56 self.assertEqual(idle.get_context(), GLib.main_context_default())
61 self.assertEqual(m.get_context(), None)
62 m.set_callback(self.my_callback, loop)
64 self.assertEqual(m.get_context(), GLib.main_context_default())
71 self.assertGreater(self.pos, 0)
72 self.assertGreaterEqual(idle.count, 0)
73 self.assertTrue(m.is_destroyed())
74 self.assertTrue(idle.is_destroyed())
76 def test_source_prepare(self):
77 # this test may not terminate if prepare() is wrapped incorrectly
79 loop = GLib.MainLoop()
81 class CustomTimeout(GLib.Source):
88 def dispatch(self, callback, args):
95 source = CustomTimeout()
98 source.set_callback(dir)
104 def test_is_destroyed_simple(self):
107 self.assertFalse(s.is_destroyed())
109 self.assertTrue(s.is_destroyed())
111 c = GLib.MainContext()
114 self.assertFalse(s.is_destroyed())
116 self.assertTrue(s.is_destroyed())
118 def test_is_destroyed_context(self):
120 c = GLib.MainContext()
126 self.assertTrue(s.is_destroyed())
128 def test_remove(self):
129 s = GLib.idle_add(dir)
130 self.assertEqual(GLib.source_remove(s), True)
131 # s is now removed, should fail now
132 self.assertEqual(GLib.source_remove(s), False)
134 # accepts large source IDs (they are unsigned)
135 self.assertEqual(GLib.source_remove(GObject.G_MAXINT32), False)
136 self.assertEqual(GLib.source_remove(GObject.G_MAXINT32 + 1), False)
137 self.assertEqual(GLib.source_remove(GObject.G_MAXUINT32), False)
139 def test_recurse_property(self):
141 self.assertTrue(s.can_recurse in [False, True])
142 s.can_recurse = False
143 self.assertFalse(s.can_recurse)
145 def test_priority(self):
147 self.assertEqual(s.priority, GLib.PRIORITY_DEFAULT_IDLE)
148 s.priority = GLib.PRIORITY_HIGH
149 self.assertEqual(s.priority, GLib.PRIORITY_HIGH)
151 s = GLib.Idle(GLib.PRIORITY_LOW)
152 self.assertEqual(s.priority, GLib.PRIORITY_LOW)
154 s = GLib.Timeout(1, GLib.PRIORITY_LOW)
155 self.assertEqual(s.priority, GLib.PRIORITY_LOW)
158 self.assertEqual(s.priority, GLib.PRIORITY_DEFAULT)
160 def test_get_current_time(self):
161 # Note, deprecated API
163 with warnings.catch_warnings(record=True) as w:
164 warnings.simplefilter('always')
165 time = s.get_current_time()
166 self.assertTrue(issubclass(w[0].category, PyGIDeprecationWarning))
168 self.assertTrue(isinstance(time, float))
169 # plausibility check, and check magnitude of result
170 self.assertGreater(time, 1300000000.0)
171 self.assertLess(time, 2000000000.0)
173 def test_add_remove_poll(self):
174 # FIXME: very shallow test, only verifies the API signature
175 pollfd = GLib.PollFD(99, GLib.IOCondition.IN | GLib.IOCondition.HUP)
176 self.assertEqual(pollfd.fd, 99)
177 source = GLib.Source()
178 source.add_poll(pollfd)
179 source.remove_poll(pollfd)
181 def test_out_of_scope_before_dispatch(self):
182 # https://bugzilla.gnome.org/show_bug.cgi?id=504337
187 class TestUserData(unittest.TestCase):
188 def test_idle_no_data(self):
193 id = GLib.idle_add(cb)
194 self.assertEqual(ml.get_context().find_source_by_id(id).priority,
195 GLib.PRIORITY_DEFAULT_IDLE)
198 def test_timeout_no_data(self):
203 id = GLib.timeout_add(50, cb)
204 self.assertEqual(ml.get_context().find_source_by_id(id).priority,
205 GLib.PRIORITY_DEFAULT)
208 def test_idle_data(self):
212 data['called'] = True
215 id = GLib.idle_add(cb, data)
216 self.assertEqual(ml.get_context().find_source_by_id(id).priority,
217 GLib.PRIORITY_DEFAULT_IDLE)
219 self.assertTrue(data['called'])
221 def test_idle_multidata(self):
225 data['called'] = True
226 data['data2'] = data2
229 id = GLib.idle_add(cb, data, 'hello')
230 self.assertEqual(ml.get_context().find_source_by_id(id).priority,
231 GLib.PRIORITY_DEFAULT_IDLE)
233 self.assertTrue(data['called'])
234 self.assertEqual(data['data2'], 'hello')
236 def test_timeout_data(self):
240 data['called'] = True
243 id = GLib.timeout_add(50, cb, data)
244 self.assertEqual(ml.get_context().find_source_by_id(id).priority,
245 GLib.PRIORITY_DEFAULT)
247 self.assertTrue(data['called'])
249 def test_timeout_multidata(self):
253 data['called'] = True
254 data['data2'] = data2
257 id = GLib.timeout_add(50, cb, data, 'hello')
258 self.assertEqual(ml.get_context().find_source_by_id(id).priority,
259 GLib.PRIORITY_DEFAULT)
261 self.assertTrue(data['called'])
262 self.assertEqual(data['data2'], 'hello')
264 def test_idle_no_data_priority(self):
269 id = GLib.idle_add(cb, priority=GLib.PRIORITY_HIGH)
270 self.assertEqual(ml.get_context().find_source_by_id(id).priority,
274 def test_timeout_no_data_priority(self):
279 id = GLib.timeout_add(50, cb, priority=GLib.PRIORITY_HIGH)
280 self.assertEqual(ml.get_context().find_source_by_id(id).priority,
284 def test_idle_data_priority(self):
288 data['called'] = True
291 id = GLib.idle_add(cb, data, priority=GLib.PRIORITY_HIGH)
292 self.assertEqual(ml.get_context().find_source_by_id(id).priority,
295 self.assertTrue(data['called'])
297 def test_timeout_data_priority(self):
301 data['called'] = True
304 id = GLib.timeout_add(50, cb, data, priority=GLib.PRIORITY_HIGH)
305 self.assertEqual(ml.get_context().find_source_by_id(id).priority,
308 self.assertTrue(data['called'])
310 def cb_no_data(self):
313 def test_idle_method_callback_no_data(self):
314 self.loop = GLib.MainLoop()
315 GLib.idle_add(self.cb_no_data)
318 def cb_with_data(self, data):
319 data['called'] = True
322 def test_idle_method_callback_with_data(self):
323 self.loop = GLib.MainLoop()
325 GLib.idle_add(self.cb_with_data, data)
327 self.assertTrue(data['called'])
330 if __name__ == '__main__':