189 lines
7.1 KiB
Python
189 lines
7.1 KiB
Python
if __name__ == '__main__':
|
|
import sys
|
|
import os
|
|
pkg_dir = os.path.split(os.path.abspath(__file__))[0]
|
|
parent_dir, pkg_name = os.path.split(pkg_dir)
|
|
is_pygame_pkg = (pkg_name == 'tests' and
|
|
os.path.split(parent_dir)[1] == 'pygame')
|
|
if not is_pygame_pkg:
|
|
sys.path.insert(0, parent_dir)
|
|
else:
|
|
is_pygame_pkg = __name__.startswith('pygame.tests.')
|
|
|
|
import unittest
|
|
import pygame
|
|
from pygame.compat import as_bytes
|
|
|
|
import pygame.sndarray
|
|
from numpy import \
|
|
int8, int16, uint8, uint16, array, alltrue
|
|
arraytype = "numpy"
|
|
|
|
|
|
class SndarrayTest (unittest.TestCase):
|
|
if arraytype:
|
|
array_dtypes = {8: uint8, -8: int8, 16: uint16, -16: int16}
|
|
|
|
def _assert_compatible(self, arr, size):
|
|
dtype = self.array_dtypes[size]
|
|
if arraytype == 'numpy':
|
|
self.failUnlessEqual(arr.dtype, dtype)
|
|
else:
|
|
self.failUnlessEqual(arr.typecode(), dtype)
|
|
|
|
def test_import(self):
|
|
'does it import'
|
|
if not arraytype:
|
|
self.fail("no array package installed")
|
|
import pygame.sndarray
|
|
|
|
def test_array(self):
|
|
if not arraytype:
|
|
self.fail("no array package installed")
|
|
|
|
def check_array(size, channels, test_data):
|
|
try:
|
|
pygame.mixer.init(22050, size, channels)
|
|
except pygame.error:
|
|
# Not all sizes are supported on all systems.
|
|
return
|
|
try:
|
|
__, sz, __ = pygame.mixer.get_init()
|
|
if sz == size:
|
|
srcarr = array(test_data, self.array_dtypes[size])
|
|
snd = pygame.sndarray.make_sound(srcarr)
|
|
arr = pygame.sndarray.array(snd)
|
|
self._assert_compatible(arr, size)
|
|
self.failUnless(alltrue(arr == srcarr),
|
|
"size: %i\n%s\n%s" %
|
|
(size, arr, test_data))
|
|
finally:
|
|
pygame.mixer.quit()
|
|
|
|
check_array(8, 1, [0, 0x0f, 0xf0, 0xff])
|
|
check_array(8, 2,
|
|
[[0, 0x80], [0x2D, 0x41], [0x64, 0xA1], [0xff, 0x40]])
|
|
check_array(16, 1, [0, 0x00ff, 0xff00, 0xffff])
|
|
check_array(16, 2, [[0, 0xffff], [0xffff, 0],
|
|
[0x00ff, 0xff00], [0x0f0f, 0xf0f0]])
|
|
check_array(-8, 1, [0, -0x80, 0x7f, 0x64])
|
|
check_array(-8, 2,
|
|
[[0, -0x80], [-0x64, 0x64], [0x25, -0x50], [0xff, 0]])
|
|
check_array(-16, 1, [0, 0x7fff, -0x7fff, -1])
|
|
check_array(-16, 2, [[0, -0x7fff], [-0x7fff, 0],
|
|
[0x7fff, 0], [0, 0x7fff]])
|
|
|
|
def test_get_arraytype(self):
|
|
if not arraytype:
|
|
self.fail("no array package installed")
|
|
|
|
self.failUnless((pygame.sndarray.get_arraytype() in
|
|
['numpy']),
|
|
("unknown array type %s" %
|
|
pygame.sndarray.get_arraytype()))
|
|
|
|
def test_get_arraytypes(self):
|
|
if not arraytype:
|
|
self.fail("no array package installed")
|
|
|
|
arraytypes = pygame.sndarray.get_arraytypes()
|
|
self.failUnless('numpy' in arraytypes)
|
|
|
|
for atype in arraytypes:
|
|
self.failUnless(atype in ['numpy'],
|
|
"unknown array type %s" % atype)
|
|
|
|
def test_make_sound(self):
|
|
if not arraytype:
|
|
self.fail("no array package installed")
|
|
|
|
def check_sound(size, channels, test_data):
|
|
try:
|
|
pygame.mixer.init(22050, size, channels)
|
|
except pygame.error:
|
|
# Not all sizes are supported on all systems.
|
|
return
|
|
try:
|
|
__, sz, __ = pygame.mixer.get_init()
|
|
if sz == size:
|
|
srcarr = array(test_data, self.array_dtypes[size])
|
|
snd = pygame.sndarray.make_sound(srcarr)
|
|
arr = pygame.sndarray.samples(snd)
|
|
self.failUnless(alltrue(arr == srcarr),
|
|
"size: %i\n%s\n%s" %
|
|
(size, arr, test_data))
|
|
finally:
|
|
pygame.mixer.quit()
|
|
|
|
check_sound(8, 1, [0, 0x0f, 0xf0, 0xff])
|
|
check_sound(8, 2,
|
|
[[0, 0x80], [0x2D, 0x41], [0x64, 0xA1], [0xff, 0x40]])
|
|
check_sound(16, 1, [0, 0x00ff, 0xff00, 0xffff])
|
|
check_sound(16, 2, [[0, 0xffff], [0xffff, 0],
|
|
[0x00ff, 0xff00], [0x0f0f, 0xf0f0]])
|
|
check_sound(-8, 1, [0, -0x80, 0x7f, 0x64])
|
|
check_sound(-8, 2,
|
|
[[0, -0x80], [-0x64, 0x64], [0x25, -0x50], [0xff, 0]])
|
|
check_sound(-16, 1, [0, 0x7fff, -0x7fff, -1])
|
|
check_sound(-16, 2, [[0, -0x7fff], [-0x7fff, 0],
|
|
[0x7fff, 0], [0, 0x7fff]])
|
|
|
|
def test_samples(self):
|
|
if not arraytype:
|
|
self.fail("no array package installed")
|
|
|
|
null_byte = as_bytes('\x00')
|
|
def check_sample(size, channels, test_data):
|
|
try:
|
|
pygame.mixer.init(22050, size, channels)
|
|
except pygame.error:
|
|
# Not all sizes are supported on all systems.
|
|
return
|
|
try:
|
|
__, sz, __ = pygame.mixer.get_init()
|
|
if sz == size:
|
|
zeroed = null_byte * ((abs(size) // 8) *
|
|
len(test_data) *
|
|
channels)
|
|
snd = pygame.mixer.Sound(buffer=zeroed)
|
|
samples = pygame.sndarray.samples(snd)
|
|
self._assert_compatible(samples, size)
|
|
##print ('X %s' % (samples.shape,))
|
|
##print ('Y %s' % (test_data,))
|
|
samples[...] = test_data
|
|
arr = pygame.sndarray.array(snd)
|
|
self.failUnless(alltrue(samples == arr),
|
|
"size: %i\n%s\n%s" %
|
|
(size, arr, test_data))
|
|
finally:
|
|
pygame.mixer.quit()
|
|
|
|
check_sample(8, 1, [0, 0x0f, 0xf0, 0xff])
|
|
check_sample(8, 2,
|
|
[[0, 0x80], [0x2D, 0x41], [0x64, 0xA1], [0xff, 0x40]])
|
|
check_sample(16, 1, [0, 0x00ff, 0xff00, 0xffff])
|
|
check_sample(16, 2, [[0, 0xffff], [0xffff, 0],
|
|
[0x00ff, 0xff00], [0x0f0f, 0xf0f0]])
|
|
check_sample(-8, 1, [0, -0x80, 0x7f, 0x64])
|
|
check_sample(-8, 2,
|
|
[[0, -0x80], [-0x64, 0x64], [0x25, -0x50], [0xff, 0]])
|
|
check_sample(-16, 1, [0, 0x7fff, -0x7fff, -1])
|
|
check_sample(-16, 2, [[0, -0x7fff], [-0x7fff, 0],
|
|
[0x7fff, 0], [0, 0x7fff]])
|
|
|
|
def test_use_arraytype(self):
|
|
if not arraytype:
|
|
self.fail("no array package installed")
|
|
|
|
def do_use_arraytype(atype):
|
|
pygame.sndarray.use_arraytype(atype)
|
|
|
|
pygame.sndarray.use_arraytype('numpy')
|
|
self.failUnlessEqual(pygame.sndarray.get_arraytype(), 'numpy')
|
|
|
|
self.failUnlessRaises(ValueError, do_use_arraytype, 'not an option')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|