358 lines
11 KiB
Python
358 lines
11 KiB
Python
|
import unittest
|
||
|
import pygame
|
||
|
import pygame._sdl2.controller as controller
|
||
|
from pygame.tests.test_utils import prompt, question
|
||
|
|
||
|
|
||
|
class ControllerModuleTest(unittest.TestCase):
|
||
|
def setUp(self):
|
||
|
controller.init()
|
||
|
|
||
|
def tearDown(self):
|
||
|
controller.quit()
|
||
|
|
||
|
def test_init(self):
|
||
|
controller.quit()
|
||
|
controller.init()
|
||
|
self.assertTrue(controller.get_init())
|
||
|
|
||
|
def test_init__multiple(self):
|
||
|
controller.init()
|
||
|
controller.init()
|
||
|
self.assertTrue(controller.get_init())
|
||
|
|
||
|
def test_quit(self):
|
||
|
controller.quit()
|
||
|
self.assertFalse(controller.get_init())
|
||
|
|
||
|
def test_quit__multiple(self):
|
||
|
controller.quit()
|
||
|
controller.quit()
|
||
|
self.assertFalse(controller.get_init())
|
||
|
|
||
|
def test_get_init(self):
|
||
|
self.assertTrue(controller.get_init())
|
||
|
|
||
|
def test_get_eventstate(self):
|
||
|
controller.set_eventstate(True)
|
||
|
self.assertTrue(controller.get_eventstate())
|
||
|
|
||
|
controller.set_eventstate(False)
|
||
|
self.assertFalse(controller.get_eventstate())
|
||
|
|
||
|
controller.set_eventstate(True)
|
||
|
|
||
|
def test_get_count(self):
|
||
|
self.assertGreaterEqual(controller.get_count(), 0)
|
||
|
|
||
|
def test_is_controller(self):
|
||
|
for i in range(controller.get_count()):
|
||
|
if controller.is_controller(i):
|
||
|
c = controller.Controller(i)
|
||
|
self.assertIsInstance(c, controller.Controller)
|
||
|
c.quit()
|
||
|
else:
|
||
|
with self.assertRaises(pygame._sdl2.sdl2.error):
|
||
|
c = controller.Controller(i)
|
||
|
|
||
|
with self.assertRaises(TypeError):
|
||
|
controller.is_controller("Test")
|
||
|
|
||
|
def test_name_forindex(self):
|
||
|
self.assertIsNone(controller.name_forindex(-1))
|
||
|
|
||
|
|
||
|
class ControllerTypeTest(unittest.TestCase):
|
||
|
def setUp(self):
|
||
|
controller.init()
|
||
|
|
||
|
def tearDown(self):
|
||
|
controller.quit()
|
||
|
|
||
|
def _get_first_controller(self):
|
||
|
for i in range(controller.get_count()):
|
||
|
if controller.is_controller(i):
|
||
|
return controller.Controller(i)
|
||
|
|
||
|
def test_construction(self):
|
||
|
c = self._get_first_controller()
|
||
|
if c:
|
||
|
self.assertIsInstance(c, controller.Controller)
|
||
|
else:
|
||
|
self.skipTest("No controller connected")
|
||
|
|
||
|
def test__auto_init(self):
|
||
|
c = self._get_first_controller()
|
||
|
if c:
|
||
|
self.assertTrue(c.get_init())
|
||
|
else:
|
||
|
self.skipTest("No controller connected")
|
||
|
|
||
|
def test_get_init(self):
|
||
|
c = self._get_first_controller()
|
||
|
if c:
|
||
|
self.assertTrue(c.get_init())
|
||
|
c.quit()
|
||
|
self.assertFalse(c.get_init())
|
||
|
else:
|
||
|
self.skipTest("No controller connected")
|
||
|
|
||
|
def test_from_joystick(self):
|
||
|
for i in range(controller.get_count()):
|
||
|
if controller.is_controller(i):
|
||
|
joy = pygame.joystick.Joystick(i)
|
||
|
break
|
||
|
else:
|
||
|
self.skipTest("No controller connected")
|
||
|
|
||
|
c = controller.Controller.from_joystick(joy)
|
||
|
self.assertIsInstance(c, controller.Controller)
|
||
|
|
||
|
def test_as_joystick(self):
|
||
|
c = self._get_first_controller()
|
||
|
if c:
|
||
|
joy = c.as_joystick()
|
||
|
self.assertIsInstance(joy, type(pygame.joystick.Joystick(0)))
|
||
|
else:
|
||
|
self.skipTest("No controller connected")
|
||
|
|
||
|
def test_get_mapping(self):
|
||
|
c = self._get_first_controller()
|
||
|
if c:
|
||
|
mapping = c.get_mapping()
|
||
|
self.assertIsInstance(mapping, dict)
|
||
|
self.assertIsNotNone(mapping["a"])
|
||
|
else:
|
||
|
self.skipTest("No controller connected")
|
||
|
|
||
|
def test_set_mapping(self):
|
||
|
c = self._get_first_controller()
|
||
|
if c:
|
||
|
mapping = c.get_mapping()
|
||
|
mapping["a"] = "b3"
|
||
|
mapping["y"] = "b0"
|
||
|
c.set_mapping(mapping)
|
||
|
new_mapping = c.get_mapping()
|
||
|
|
||
|
self.assertEqual(len(mapping), len(new_mapping))
|
||
|
for i in mapping:
|
||
|
if mapping[i] not in ("a", "y"):
|
||
|
self.assertEqual(mapping[i], new_mapping[i])
|
||
|
else:
|
||
|
if i == "a":
|
||
|
self.assertEqual(new_mapping[i], mapping["y"])
|
||
|
else:
|
||
|
self.assertEqual(new_mapping[i], mapping["a"])
|
||
|
else:
|
||
|
self.skipTest("No controller connected")
|
||
|
|
||
|
|
||
|
class ControllerInteractiveTest(unittest.TestCase):
|
||
|
__tags__ = ["interactive"]
|
||
|
|
||
|
def _get_first_controller(self):
|
||
|
for i in range(controller.get_count()):
|
||
|
if controller.is_controller(i):
|
||
|
return controller.Controller(i)
|
||
|
|
||
|
def setUp(self):
|
||
|
controller.init()
|
||
|
|
||
|
def tearDown(self):
|
||
|
controller.quit()
|
||
|
|
||
|
def test__get_count_interactive(self):
|
||
|
prompt(
|
||
|
"Please connect at least one controller "
|
||
|
"before the test for controller.get_count() starts"
|
||
|
)
|
||
|
|
||
|
# Reset the number of joysticks counted
|
||
|
controller.quit()
|
||
|
controller.init()
|
||
|
|
||
|
joystick_num = controller.get_count()
|
||
|
ans = question(
|
||
|
"get_count() thinks there are {} joysticks "
|
||
|
"connected. Is that correct?".format(joystick_num)
|
||
|
)
|
||
|
|
||
|
self.assertTrue(ans)
|
||
|
|
||
|
def test_set_eventstate_on_interactive(self):
|
||
|
c = self._get_first_controller()
|
||
|
if not c:
|
||
|
self.skipTest("No controller connected")
|
||
|
|
||
|
pygame.display.init()
|
||
|
pygame.font.init()
|
||
|
|
||
|
screen = pygame.display.set_mode((400, 400))
|
||
|
font = pygame.font.Font(None, 20)
|
||
|
running = True
|
||
|
|
||
|
screen.fill((255, 255, 255))
|
||
|
screen.blit(
|
||
|
font.render("Press button 'x' (on ps4) or 'a' (on xbox).", True, (0, 0, 0)),
|
||
|
(0, 0),
|
||
|
)
|
||
|
pygame.display.update()
|
||
|
|
||
|
controller.set_eventstate(True)
|
||
|
|
||
|
while running:
|
||
|
for event in pygame.event.get():
|
||
|
if event.type == pygame.QUIT:
|
||
|
running = False
|
||
|
|
||
|
if event.type == pygame.CONTROLLERBUTTONDOWN:
|
||
|
running = False
|
||
|
|
||
|
pygame.display.quit()
|
||
|
pygame.font.quit()
|
||
|
|
||
|
def test_set_eventstate_off_interactive(self):
|
||
|
c = self._get_first_controller()
|
||
|
if not c:
|
||
|
self.skipTest("No controller connected")
|
||
|
|
||
|
pygame.display.init()
|
||
|
pygame.font.init()
|
||
|
|
||
|
screen = pygame.display.set_mode((400, 400))
|
||
|
font = pygame.font.Font(None, 20)
|
||
|
running = True
|
||
|
|
||
|
screen.fill((255, 255, 255))
|
||
|
screen.blit(
|
||
|
font.render("Press button 'x' (on ps4) or 'a' (on xbox).", True, (0, 0, 0)),
|
||
|
(0, 0),
|
||
|
)
|
||
|
pygame.display.update()
|
||
|
|
||
|
controller.set_eventstate(False)
|
||
|
|
||
|
while running:
|
||
|
for event in pygame.event.get(pygame.QUIT):
|
||
|
if event:
|
||
|
running = False
|
||
|
|
||
|
if c.get_button(pygame.CONTROLLER_BUTTON_A):
|
||
|
if pygame.event.peek(pygame.CONTROLLERBUTTONDOWN):
|
||
|
pygame.display.quit()
|
||
|
pygame.font.quit()
|
||
|
self.fail()
|
||
|
else:
|
||
|
running = False
|
||
|
|
||
|
pygame.display.quit()
|
||
|
pygame.font.quit()
|
||
|
|
||
|
def test_get_button_interactive(self):
|
||
|
c = self._get_first_controller()
|
||
|
if not c:
|
||
|
self.skipTest("No controller connected")
|
||
|
|
||
|
pygame.display.init()
|
||
|
pygame.font.init()
|
||
|
|
||
|
screen = pygame.display.set_mode((400, 400))
|
||
|
font = pygame.font.Font(None, 20)
|
||
|
running = True
|
||
|
|
||
|
label1 = font.render(
|
||
|
"Press button 'x' (on ps4) or 'a' (on xbox).", True, (0, 0, 0)
|
||
|
)
|
||
|
|
||
|
label2 = font.render(
|
||
|
'The two values should match up. Press "y" or "n" to confirm.',
|
||
|
True,
|
||
|
(0, 0, 0),
|
||
|
)
|
||
|
|
||
|
is_pressed = [False, False] # event, get_button()
|
||
|
while running:
|
||
|
for event in pygame.event.get():
|
||
|
if event.type == pygame.QUIT:
|
||
|
running = False
|
||
|
if event.type == pygame.CONTROLLERBUTTONDOWN and event.button == 0:
|
||
|
is_pressed[0] = True
|
||
|
if event.type == pygame.CONTROLLERBUTTONUP and event.button == 0:
|
||
|
is_pressed[0] = False
|
||
|
|
||
|
if event.type == pygame.KEYDOWN:
|
||
|
if event.key == pygame.K_y:
|
||
|
running = False
|
||
|
if event.key == pygame.K_n:
|
||
|
running = False
|
||
|
pygame.display.quit()
|
||
|
pygame.font.quit()
|
||
|
self.fail()
|
||
|
|
||
|
is_pressed[1] = c.get_button(pygame.CONTROLLER_BUTTON_A)
|
||
|
|
||
|
screen.fill((255, 255, 255))
|
||
|
screen.blit(label1, (0, 0))
|
||
|
screen.blit(label2, (0, 20))
|
||
|
screen.blit(font.render(str(is_pressed), True, (0, 0, 0)), (0, 40))
|
||
|
pygame.display.update()
|
||
|
|
||
|
pygame.display.quit()
|
||
|
pygame.font.quit()
|
||
|
|
||
|
def test_get_axis_interactive(self):
|
||
|
c = self._get_first_controller()
|
||
|
if not c:
|
||
|
self.skipTest("No controller connected")
|
||
|
|
||
|
pygame.display.init()
|
||
|
pygame.font.init()
|
||
|
|
||
|
screen = pygame.display.set_mode((400, 400))
|
||
|
font = pygame.font.Font(None, 20)
|
||
|
running = True
|
||
|
|
||
|
label1 = font.render(
|
||
|
"Press down the right trigger. The value on-screen should", True, (0, 0, 0)
|
||
|
)
|
||
|
|
||
|
label2 = font.render(
|
||
|
"indicate how far the trigger is pressed down. This value should",
|
||
|
True,
|
||
|
(0, 0, 0),
|
||
|
)
|
||
|
|
||
|
label3 = font.render(
|
||
|
'be in the range of 0-32767. Press "y" or "n" to confirm.', True, (0, 0, 0)
|
||
|
)
|
||
|
|
||
|
while running:
|
||
|
for event in pygame.event.get():
|
||
|
if event.type == pygame.QUIT:
|
||
|
running = False
|
||
|
|
||
|
if event.type == pygame.KEYDOWN:
|
||
|
if event.key == pygame.K_y:
|
||
|
running = False
|
||
|
if event.key == pygame.K_n:
|
||
|
running = False
|
||
|
pygame.display.quit()
|
||
|
pygame.font.quit()
|
||
|
self.fail()
|
||
|
|
||
|
right_trigger = c.get_axis(pygame.CONTROLLER_AXIS_TRIGGERRIGHT)
|
||
|
|
||
|
screen.fill((255, 255, 255))
|
||
|
screen.blit(label1, (0, 0))
|
||
|
screen.blit(label2, (0, 20))
|
||
|
screen.blit(label3, (0, 40))
|
||
|
screen.blit(font.render(str(right_trigger), True, (0, 0, 0)), (0, 60))
|
||
|
pygame.display.update()
|
||
|
|
||
|
pygame.display.quit()
|
||
|
pygame.font.quit()
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
unittest.main()
|