ProjektAI/venv/Lib/site-packages/pygame/tests/surflock_test.py
2020-04-20 22:51:16 +02:00

144 lines
4.6 KiB
Python

import unittest
import sys
import platform
import pygame
IS_PYPY = 'PyPy' == platform.python_implementation()
@unittest.skipIf(IS_PYPY, 'pypy skip known failure') # TODO
class SurfaceLockTest(unittest.TestCase):
def test_lock(self):
sf = pygame.Surface((5, 5))
sf.lock()
self.assertEqual(sf.get_locked(), True)
self.assertEqual(sf.get_locks(), (sf,))
sf.lock()
self.assertEqual(sf.get_locked(), True)
self.assertEqual(sf.get_locks(), (sf, sf))
sf.unlock()
self.assertEqual(sf.get_locked(), True)
self.assertEqual(sf.get_locks(), (sf,))
sf.unlock()
self.assertEqual(sf.get_locked(), False)
self.assertEqual(sf.get_locks(), ())
def test_subsurface_lock(self):
sf = pygame.Surface((5, 5))
subsf = sf.subsurface((1, 1, 2, 2))
sf2 = pygame.Surface((5, 5))
# Simple blits, nothing should happen here.
sf2.blit(subsf, (0, 0))
sf2.blit(sf, (0, 0))
# Test blitting on self:
self.assertRaises(pygame.error, sf.blit, subsf, (0, 0))
#self.assertRaises(pygame.error, subsf.blit, sf, (0, 0))
# ^ Fails although it should not in my opinion. If I cannot
# blit the subsurface to the surface, it should not be allowed
# the other way around as well.
# Test additional locks.
sf.lock()
sf2.blit(subsf, (0, 0))
self.assertRaises(pygame.error, sf2.blit, sf, (0, 0))
subsf.lock()
self.assertRaises(pygame.error, sf2.blit, subsf, (0, 0))
self.assertRaises(pygame.error, sf2.blit, sf, (0, 0))
# sf and subsf are now explicitly locked. Unlock sf, so we can
# (assume) to blit it.
# It will fail though as the subsurface still has a lock around,
# which is okay and correct behaviour.
sf.unlock()
self.assertRaises(pygame.error, sf2.blit, subsf, (0, 0))
self.assertRaises(pygame.error, sf2.blit, sf, (0, 0))
# Run a second unlock on the surface. This should ideally have
# no effect as the subsurface is the locking reason!
sf.unlock()
self.assertRaises(pygame.error, sf2.blit, sf, (0, 0))
self.assertRaises(pygame.error, sf2.blit, subsf, (0, 0))
subsf.unlock()
sf.lock()
self.assertEqual(sf.get_locked(), True)
self.assertEqual(sf.get_locks(), (sf,))
self.assertEqual(subsf.get_locked(), False)
self.assertEqual(subsf.get_locks(), ())
subsf.lock()
self.assertEqual(sf.get_locked(), True)
self.assertEqual(sf.get_locks(), (sf, subsf))
self.assertEqual(subsf.get_locked(), True)
self.assertEqual(subsf.get_locks(), (subsf,))
sf.unlock()
self.assertEqual(sf.get_locked(), True)
self.assertEqual(sf.get_locks(), (subsf,))
self.assertEqual(subsf.get_locked(), True)
self.assertEqual(subsf.get_locks(), (subsf,))
subsf.unlock()
self.assertEqual(sf.get_locked(), False)
self.assertEqual(sf.get_locks(), ())
self.assertEqual(subsf.get_locked(), False)
self.assertEqual(subsf.get_locks(), ())
subsf.lock()
self.assertEqual(sf.get_locked(), True)
self.assertEqual(sf.get_locks(), (subsf,))
self.assertEqual(subsf.get_locked(), True)
self.assertEqual(subsf.get_locks(), (subsf,))
subsf.lock()
self.assertEqual(sf.get_locked(), True)
self.assertEqual(sf.get_locks(), (subsf, subsf))
self.assertEqual(subsf.get_locked(), True)
self.assertEqual(subsf.get_locks(), (subsf, subsf))
def test_pxarray_ref(self):
sf = pygame.Surface((5, 5))
ar = pygame.PixelArray(sf)
ar2 = pygame.PixelArray(sf)
self.assertEqual(sf.get_locked(), True)
self.assertEqual(sf.get_locks(), (ar, ar2))
del ar
self.assertEqual(sf.get_locked(), True)
self.assertEqual(sf.get_locks(), (ar2,))
ar = ar2[:]
self.assertEqual(sf.get_locked(), True)
self.assertEqual(sf.get_locks(), (ar2,))
del ar
self.assertEqual(sf.get_locked(), True)
self.assertEqual(len(sf.get_locks()), 1)
def test_buffer(self):
sf = pygame.Surface((5, 5))
buf = sf.get_buffer()
self.assertEqual(sf.get_locked(), True)
self.assertEqual(sf.get_locks(), (buf,))
sf.unlock()
self.assertEqual(sf.get_locked(), True)
self.assertEqual(sf.get_locks(), (buf,))
del buf
self.assertEqual(sf.get_locked(), False)
self.assertEqual(sf.get_locks(), ())
if __name__ == '__main__':
unittest.main()