pySSTV/pysstv/tests/test_sstv.py

86 wiersze
3.0 KiB
Python
Czysty Zwykły widok Historia

import unittest
from itertools import islice
from six.moves import zip
import pickle
import mock
from mock import MagicMock
2017-01-12 11:37:58 +00:00
from six import BytesIO
from six import PY2
import hashlib
2013-06-24 11:41:35 +00:00
from pysstv import sstv
from pysstv.sstv import SSTV
from pysstv.tests.common import get_asset_filename
class TestSSTV(unittest.TestCase):
def setUp(self):
self.s = SSTV(False, 48000, 16)
self.s.VIS_CODE = 0x00
self.s.SYNC = 7
def test_horizontal_sync(self):
horizontal_sync = self.s.horizontal_sync()
expected = (1200, self.s.SYNC)
actual = next(iter(horizontal_sync))
self.assertEqual(expected, actual)
def test_gen_freq_bits(self):
gen_freq_bits = self.s.gen_freq_bits()
expected = [(1900, 300),
(1200, 10),
(1900, 300),
(1200, 30),
(1300, 30),
(1300, 30),
(1300, 30),
(1300, 30),
(1300, 30),
(1300, 30),
(1300, 30),
(1300, 30),
(1200, 30)]
actual = list(islice(gen_freq_bits, 0, 1000))
self.assertEqual(expected, actual)
# FIXME: Instead of using a test fixture, 'expected' should be synthesized?
def test_gen_values(self):
gen_values = self.s.gen_values()
with open(get_asset_filename("SSTV_gen_values.p"), 'rb') as f:
expected = pickle.load(f)
for e, g in zip(expected, gen_values):
self.assertAlmostEqual(e, g, delta=0.000000001)
def test_gen_samples(self):
gen_values = self.s.gen_samples()
2013-06-18 21:55:07 +00:00
# gen_samples uses random to avoid quantization noise
# by using additive noise, so there's always a chance
# of running the code two consecutive times on the same machine
# and having different results.
# https://en.wikipedia.org/wiki/Quantization_%28signal_processing%29
sstv.random = MagicMock(return_value=0.4) # xkcd:221
with open(get_asset_filename("SSTV_gen_samples.p"), 'rb') as f:
expected = pickle.load(f)
actual = list(islice(gen_values, 0, 1000))
for e, a in zip(expected, actual):
self.assertAlmostEqual(e, a, delta=1)
def test_write_wav(self):
self.maxDiff = None
2017-01-12 11:37:58 +00:00
bio = BytesIO()
bio.close = MagicMock() # ignore close() so we can .getvalue()
mock_open = MagicMock(return_value=bio)
ns = '__builtin__' if PY2 else 'builtins'
with mock.patch('{0}.open'.format(ns), mock_open):
self.s.write_wav('unittest.wav')
expected = 'dd7eed880ab3360fb79ce09c469deee2'
2017-01-12 11:37:58 +00:00
data = bio.getvalue()
2013-06-18 21:55:07 +00:00
actual = hashlib.md5(data).hexdigest()
self.assertEqual(expected, actual)
def test_init(self):
self.assertEqual(self.s.image, False)
self.assertEqual(self.s.samples_per_sec, 48000)
self.assertEqual(self.s.bits, 16)