forked from s444420/AL-2020
341 lines
10 KiB
Python
341 lines
10 KiB
Python
|
import os
|
||
|
import unittest
|
||
|
|
||
|
import pygame
|
||
|
from pygame.compat import as_unicode
|
||
|
|
||
|
################################################################################
|
||
|
|
||
|
events = (
|
||
|
# pygame.NOEVENT,
|
||
|
# pygame.ACTIVEEVENT,
|
||
|
pygame.KEYDOWN,
|
||
|
pygame.KEYUP,
|
||
|
pygame.MOUSEMOTION,
|
||
|
pygame.MOUSEBUTTONDOWN,
|
||
|
pygame.MOUSEBUTTONUP,
|
||
|
pygame.JOYAXISMOTION,
|
||
|
pygame.JOYBALLMOTION,
|
||
|
pygame.JOYHATMOTION,
|
||
|
pygame.JOYBUTTONDOWN,
|
||
|
pygame.JOYBUTTONUP,
|
||
|
pygame.VIDEORESIZE,
|
||
|
pygame.VIDEOEXPOSE,
|
||
|
pygame.QUIT,
|
||
|
pygame.SYSWMEVENT,
|
||
|
pygame.USEREVENT,
|
||
|
# pygame.NUMEVENTS,
|
||
|
)
|
||
|
|
||
|
|
||
|
class EventTypeTest(unittest.TestCase):
|
||
|
def test_Event(self):
|
||
|
"""Ensure an Event object can be created."""
|
||
|
e = pygame.event.Event(pygame.USEREVENT, some_attr=1, other_attr='1')
|
||
|
|
||
|
self.assertEqual(e.some_attr, 1)
|
||
|
self.assertEqual(e.other_attr, "1")
|
||
|
|
||
|
# Event now uses tp_dictoffset and tp_members: request 62
|
||
|
# on Motherhamster Bugzilla.
|
||
|
self.assertEqual(e.type, pygame.USEREVENT)
|
||
|
self.assertIs(e.dict, e.__dict__)
|
||
|
|
||
|
e.some_attr = 12
|
||
|
|
||
|
self.assertEqual(e.some_attr, 12)
|
||
|
|
||
|
e.new_attr = 15
|
||
|
|
||
|
self.assertEqual(e.new_attr, 15)
|
||
|
|
||
|
# For Python 2.x a TypeError is raised for a readonly member;
|
||
|
# for Python 3.x it is an AttributeError.
|
||
|
self.assertRaises((TypeError, AttributeError), setattr, e, 'type', 0)
|
||
|
self.assertRaises((TypeError, AttributeError), setattr, e, 'dict', None)
|
||
|
|
||
|
# Ensure attributes are visible to dir(), part of the original
|
||
|
# posted request.
|
||
|
d = dir(e)
|
||
|
attrs = ('type', 'dict', '__dict__', 'some_attr', 'other_attr',
|
||
|
'new_attr')
|
||
|
|
||
|
for attr in attrs:
|
||
|
self.assertIn(attr, d)
|
||
|
|
||
|
def test_as_str(self):
|
||
|
# Bug reported on Pygame mailing list July 24, 2011:
|
||
|
# For Python 3.x str(event) to raises an UnicodeEncodeError when
|
||
|
# an event attribute is a string with a non-ascii character.
|
||
|
try:
|
||
|
str(pygame.event.Event(events[0], a=as_unicode(r"\xed")))
|
||
|
except UnicodeEncodeError:
|
||
|
self.fail("Event object raised exception for non-ascii character")
|
||
|
# Passed.
|
||
|
|
||
|
|
||
|
race_condition_notification = """
|
||
|
This test is dependent on timing. The event queue is cleared in preparation for
|
||
|
tests. There is a small window where outside events from the OS may have effected
|
||
|
results. Try running the test again.
|
||
|
"""
|
||
|
|
||
|
class EventModuleArgsTest(unittest.TestCase):
|
||
|
def setUp(self):
|
||
|
pygame.display.init()
|
||
|
pygame.event.clear()
|
||
|
|
||
|
def tearDown(self):
|
||
|
pygame.display.quit()
|
||
|
|
||
|
def test_get(self):
|
||
|
pygame.event.get()
|
||
|
pygame.event.get(None)
|
||
|
pygame.event.get(None, True)
|
||
|
|
||
|
pygame.event.get(pump=False)
|
||
|
pygame.event.get(pump=True)
|
||
|
pygame.event.get(eventtype=None)
|
||
|
pygame.event.get(eventtype=pygame.USEREVENT,
|
||
|
pump=False)
|
||
|
|
||
|
def test_clear(self):
|
||
|
pygame.event.clear()
|
||
|
pygame.event.clear(None)
|
||
|
pygame.event.clear(None, True)
|
||
|
|
||
|
pygame.event.clear(pump=False)
|
||
|
pygame.event.clear(pump=True)
|
||
|
pygame.event.clear(eventtype=None)
|
||
|
pygame.event.clear(eventtype=pygame.USEREVENT,
|
||
|
pump=False)
|
||
|
|
||
|
def test_peek(self):
|
||
|
pygame.event.peek()
|
||
|
pygame.event.peek(None)
|
||
|
pygame.event.peek(None, True)
|
||
|
|
||
|
pygame.event.peek(pump=False)
|
||
|
pygame.event.peek(pump=True)
|
||
|
pygame.event.peek(eventtype=None)
|
||
|
pygame.event.peek(eventtype=pygame.USEREVENT,
|
||
|
pump=False)
|
||
|
|
||
|
|
||
|
class EventModuleTest(unittest.TestCase):
|
||
|
def setUp(self):
|
||
|
pygame.display.init()
|
||
|
pygame.event.clear() # flush events
|
||
|
|
||
|
def tearDown(self):
|
||
|
pygame.event.clear() # flush events
|
||
|
pygame.display.quit()
|
||
|
|
||
|
def test_event_attribute(self):
|
||
|
e1 = pygame.event.Event(pygame.USEREVENT, attr1='attr1')
|
||
|
self.assertEqual(e1.attr1, 'attr1')
|
||
|
|
||
|
def test_set_blocked(self):
|
||
|
"""Ensure events can be blocked from the queue."""
|
||
|
event = events[0]
|
||
|
pygame.event.set_blocked(event)
|
||
|
|
||
|
self.assertTrue(pygame.event.get_blocked(event))
|
||
|
|
||
|
pygame.event.post(pygame.event.Event(event))
|
||
|
ret = pygame.event.get()
|
||
|
should_be_blocked = [e for e in ret if e.type == event]
|
||
|
|
||
|
self.assertEqual(should_be_blocked, [])
|
||
|
|
||
|
def test_set_blocked_all(self):
|
||
|
"""Ensure all events can be unblocked at once."""
|
||
|
pygame.event.set_blocked(None)
|
||
|
|
||
|
for e in events:
|
||
|
self.assertTrue(pygame.event.get_blocked(e))
|
||
|
|
||
|
def test_post__and_poll(self):
|
||
|
"""Ensure events can be posted to the queue."""
|
||
|
e1 = pygame.event.Event(pygame.USEREVENT, attr1='attr1')
|
||
|
pygame.event.post(e1)
|
||
|
posted_event = pygame.event.poll()
|
||
|
|
||
|
self.assertEqual(e1.attr1, posted_event.attr1,
|
||
|
race_condition_notification)
|
||
|
|
||
|
# fuzzing event types
|
||
|
for i in range(1, 11):
|
||
|
pygame.event.post(pygame.event.Event(events[i]))
|
||
|
|
||
|
self.assertEqual(pygame.event.poll().type, events[i],
|
||
|
race_condition_notification)
|
||
|
|
||
|
def test_post_large_user_event(self):
|
||
|
pygame.event.post(pygame.event.Event(pygame.USEREVENT, {'a': "a" * 1024}))
|
||
|
e = pygame.event.poll()
|
||
|
|
||
|
self.assertEqual(e.type, pygame.USEREVENT)
|
||
|
self.assertEqual(e.a, "a" * 1024)
|
||
|
|
||
|
def test_get(self):
|
||
|
"""Ensure get() retrieves all the events on the queue."""
|
||
|
event_cnt = 10
|
||
|
for _ in range(event_cnt):
|
||
|
pygame.event.post(pygame.event.Event(pygame.USEREVENT))
|
||
|
|
||
|
queue = pygame.event.get()
|
||
|
|
||
|
self.assertEqual(len(queue), event_cnt)
|
||
|
self.assertTrue(all(e.type == pygame.USEREVENT for e in queue))
|
||
|
|
||
|
def test_get_type(self):
|
||
|
ev = pygame.event.Event(pygame.USEREVENT)
|
||
|
pygame.event.post(ev)
|
||
|
queue = pygame.event.get(pygame.USEREVENT)
|
||
|
self.assertEqual(len(queue), 1)
|
||
|
self.assertEqual(queue[0].type, pygame.USEREVENT)
|
||
|
|
||
|
def test_clear(self):
|
||
|
"""Ensure clear() removes all the events on the queue."""
|
||
|
for e in events:
|
||
|
pygame.event.post(pygame.event.Event(e))
|
||
|
|
||
|
poll_event = pygame.event.poll()
|
||
|
|
||
|
self.assertNotEqual(poll_event.type, pygame.NOEVENT)
|
||
|
|
||
|
pygame.event.clear()
|
||
|
poll_event = pygame.event.poll()
|
||
|
|
||
|
self.assertEqual(poll_event.type, pygame.NOEVENT,
|
||
|
race_condition_notification)
|
||
|
|
||
|
def test_event_name(self):
|
||
|
"""Ensure event_name() returns the correct event name."""
|
||
|
self.assertEqual(pygame.event.event_name(pygame.KEYDOWN), "KeyDown")
|
||
|
self.assertEqual(pygame.event.event_name(pygame.USEREVENT),
|
||
|
"UserEvent")
|
||
|
|
||
|
def test_wait(self):
|
||
|
"""Ensure wait() waits for an event on the queue."""
|
||
|
event = pygame.event.Event(events[0])
|
||
|
pygame.event.post(event)
|
||
|
wait_event = pygame.event.wait()
|
||
|
|
||
|
self.assertEqual(wait_event.type, event.type)
|
||
|
|
||
|
def test_peek(self):
|
||
|
"""Ensure queued events can be peeked at."""
|
||
|
event_types = [pygame.KEYDOWN, pygame.KEYUP, pygame.MOUSEMOTION]
|
||
|
|
||
|
for event_type in event_types:
|
||
|
pygame.event.post(pygame.event.Event(event_type))
|
||
|
|
||
|
for event_type in event_types:
|
||
|
self.assertTrue(pygame.event.peek(event_type))
|
||
|
|
||
|
self.assertTrue(pygame.event.peek(event_types))
|
||
|
|
||
|
def test_peek_empty(self):
|
||
|
pygame.event.clear()
|
||
|
self.assertFalse(pygame.event.peek())
|
||
|
|
||
|
def test_set_allowed(self):
|
||
|
"""Ensure a blocked event type can be unblocked/allowed."""
|
||
|
event = events[0]
|
||
|
pygame.event.set_blocked(event)
|
||
|
|
||
|
self.assertTrue(pygame.event.get_blocked(event))
|
||
|
|
||
|
pygame.event.set_allowed(event)
|
||
|
|
||
|
self.assertFalse(pygame.event.get_blocked(event))
|
||
|
|
||
|
def test_set_allowed_all(self):
|
||
|
"""Ensure all events can be unblocked/allowed at once."""
|
||
|
pygame.event.set_blocked(None)
|
||
|
|
||
|
for e in events:
|
||
|
self.assertTrue(pygame.event.get_blocked(e))
|
||
|
|
||
|
pygame.event.set_allowed(None)
|
||
|
|
||
|
for e in events:
|
||
|
self.assertFalse(pygame.event.get_blocked(e))
|
||
|
|
||
|
def test_pump(self):
|
||
|
"""Ensure pump() functions properly."""
|
||
|
pygame.event.pump()
|
||
|
|
||
|
@unittest.skipIf(os.environ.get('SDL_VIDEODRIVER') == 'dummy',
|
||
|
'requires the SDL_VIDEODRIVER to be a non "dummy" value')
|
||
|
def test_set_grab__and_get_symmetric(self):
|
||
|
"""Ensure event grabbing can be enabled and disabled."""
|
||
|
surf = pygame.display.set_mode((10,10))
|
||
|
pygame.event.set_grab(True)
|
||
|
|
||
|
self.assertTrue(pygame.event.get_grab())
|
||
|
|
||
|
pygame.event.set_grab(False)
|
||
|
|
||
|
self.assertFalse(pygame.event.get_grab())
|
||
|
|
||
|
def test_event_equality(self):
|
||
|
a = pygame.event.Event(events[0], a=1)
|
||
|
b = pygame.event.Event(events[0], a=1)
|
||
|
c = pygame.event.Event(events[1], a=1)
|
||
|
d = pygame.event.Event(events[0], a=2)
|
||
|
|
||
|
self.assertTrue(a == a)
|
||
|
self.assertFalse(a != a)
|
||
|
self.assertTrue(a == b)
|
||
|
self.assertFalse(a != b)
|
||
|
self.assertTrue(a != c)
|
||
|
self.assertFalse(a == c)
|
||
|
self.assertTrue(a != d)
|
||
|
self.assertFalse(a == d)
|
||
|
|
||
|
def todo_test_get_blocked(self):
|
||
|
|
||
|
# __doc__ (as of 2008-08-02) for pygame.event.get_blocked:
|
||
|
|
||
|
# pygame.event.get_blocked(type): return bool
|
||
|
# test if a type of event is blocked from the queue
|
||
|
#
|
||
|
# Returns true if the given event type is blocked from the queue.
|
||
|
|
||
|
self.fail()
|
||
|
|
||
|
def todo_test_get_grab(self):
|
||
|
|
||
|
# __doc__ (as of 2008-08-02) for pygame.event.get_grab:
|
||
|
|
||
|
# pygame.event.get_grab(): return bool
|
||
|
# test if the program is sharing input devices
|
||
|
#
|
||
|
# Returns true when the input events are grabbed for this application.
|
||
|
# Use pygame.event.set_grab() to control this state.
|
||
|
#
|
||
|
|
||
|
self.fail()
|
||
|
|
||
|
def todo_test_poll(self):
|
||
|
|
||
|
# __doc__ (as of 2008-08-02) for pygame.event.poll:
|
||
|
|
||
|
# pygame.event.poll(): return Event
|
||
|
# get a single event from the queue
|
||
|
#
|
||
|
# Returns a single event from the queue. If the event queue is empty
|
||
|
# an event of type pygame.NOEVENT will be returned immediately. The
|
||
|
# returned event is removed from the queue.
|
||
|
#
|
||
|
|
||
|
self.fail()
|
||
|
|
||
|
################################################################################
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
unittest.main()
|