class SineSourceTest(unittest.TestCase): def setUp(self): self.s = SineSource(channels=2, freq=1, amp=0.5, phase=pi / 2) self.s2 = SineSource(channels=2, freq=1, amp=0.5, phase=pi / 2, length=self.s.rate) def test_params(self): self.assertEqual(self.s.channels, 2) self.assertTrue(self.s.endless) def test_read(self): second = list(islice(self.s.read(), 0, self.s.rate)) self.assertAlmostEqual(second[0][0], 0.5) self.assertAlmostEqual(second[0][1], 0.5) self.assertAlmostEqual(second[-1][0], 0.5) self.assertAlmostEqual(second[-1][1], 0.5) self.assertAlmostEqual(second[int(self.s.rate / 2)][0], -0.5) self.assertAlmostEqual(second[int(self.s.rate / 2)][1], -0.5) self.assertAlmostEqual(second[int(self.s.rate / 4)][0], 0.0, 4) self.assertAlmostEqual(second[int(self.s.rate / 4)][1], 0.0, 4) self.assertTrue(second[int(self.s.rate / 4 - 1)][0] > 0.0) self.assertTrue(second[int(self.s.rate / 4 - 1)][1] > 0.0) self.assertTrue(second[int(self.s.rate / 4 + 1)][0] < 0.0) self.assertTrue(second[int(self.s.rate / 4 + 1)][1] < 0.0) self.assertEqual(second, list(self.s2.read()))
def test_write(self): source = SineSource(channels=2, freq=441, amp=0.5, phase=pi / 2, length=44100) data = list(source.read()) for f in xrange(1, 5): fname = path.join(gettempdir(), "%s" % f) w = self.w(fname, channels=source.channels, rate=source.rate, depth=f) w.write(data) w.close() r = self.r(fname) self.assertEqual(r.rate, 44100) self.assertEqual(r.channels, 2) self.assertEqual(r.depth, f) chunk = list(r.read()) self.assertEqual(chunk[0], [0.5, 0.5]) self.assertEqual(chunk[25], [0.0, 0.0]) self.assertEqual(chunk[50], [-0.5, -0.5]) unlink(fname)
def test_write(self): source = SineSource(channels=2, freq=441, amp=0.5, phase=pi / 2, length=44100) data = list(source.read()) fname = path.join(gettempdir(), "test.mat") w = MatWriter(fname) w.write(data) w.close() # Comprehensive testing using scipy loadmat routine try: from scipy.io import loadmat f = loadmat(fname) self.assertTrue("signal" in f) self.assertEqual(f["signal"].shape, (len(data), 2)) self.assertEqual(tuple(f["signal"][0]), (0.5, 0.5)) except ImportError: print("No scipy found :(") pass # Less comprehensive testing for scipy-poor systems (like pypy) # File size self.assertEqual(path.getsize(fname), 128 + # Header 8 + 16 + 16 + 16 + # Array tag, array flags, dimensions, name 8 + # Data tag len(data) * 2 * 8 # Data size ) with open(fname, "rb") as f: f.seek(128 + 8 + 16 + 16 + 16 + 8) s = f.read(8) self.assertEqual(unpack("<d", s)[0], 0.5) f.seek((len(data) - 1) * 8) self.assertEqual(unpack("<d", s)[0], 0.5) unlink(fname)
def test_sources(self): samples = 100 r1 = SineSource(freq=1000, channels=2) r2 = SineSource(freq=1000, channels=2) s1 = Stack( [ (LowPassFilter(samplerate=r2.rate, channels=r2.channels), "output"), [RMS(samplerate=r2.rate, channels=r2.channels), ("rms", "output")], ] ) s2 = Stack( [ (LowPassFilter(samplerate=r2.rate, channels=r2.channels), "output"), [RMS(samplerate=r2.rate, channels=r2.channels), ("rms", "output")], ] ) s3 = Stack( [ [RMS(samplerate=r2.rate, channels=r2.channels), ("rms", "output")], (LowPassFilter(samplerate=r2.rate, channels=r2.channels), "output"), ] ) chunk = list(islice(r1.read(), 0, samples)) out1 = s1.process(chunk) out2 = s2.process_source(r2, samples) out3 = s3.process(chunk) self.assertEqual(out1, out2) self.assertEqual(out1, out3) self.assertEqual(out1, s2.probe_results["0_output"]) self.assertEqual(out1, s2.probe_results["1_output"]) self.assertEqual(chunk, s1.probe_results["input"])