blob: 1b0baeeb647bc35ed1a0dc11f6a538f47cc60141 [file] [log] [blame]
Serhiy Storchaka34d20132013-09-05 17:01:53 +03001from test.support import TESTFN, unlink
Victor Stinner7f3652e2010-06-07 20:14:04 +00002import unittest
Serhiy Storchakae06a8962013-09-04 00:43:03 +03003import pickle
Victor Stinner7f3652e2010-06-07 20:14:04 +00004import os
5
6import sunau
7
8nchannels = 2
9sampwidth = 2
10framerate = 8000
11nframes = 100
12
13class SunAUTest(unittest.TestCase):
14
15 def setUp(self):
16 self.f = None
17
18 def tearDown(self):
19 if self.f is not None:
20 self.f.close()
Serhiy Storchaka34d20132013-09-05 17:01:53 +030021 unlink(TESTFN)
Victor Stinner7f3652e2010-06-07 20:14:04 +000022
23 def test_lin(self):
24 self.f = sunau.open(TESTFN, 'w')
25 self.f.setnchannels(nchannels)
26 self.f.setsampwidth(sampwidth)
27 self.f.setframerate(framerate)
28 self.f.setcomptype('NONE', 'not compressed')
29 output = b'\xff\x00\x12\xcc' * (nframes * nchannels * sampwidth // 4)
30 self.f.writeframes(output)
31 self.f.close()
32
33 self.f = sunau.open(TESTFN, 'rb')
34 self.assertEqual(nchannels, self.f.getnchannels())
35 self.assertEqual(sampwidth, self.f.getsampwidth())
36 self.assertEqual(framerate, self.f.getframerate())
37 self.assertEqual(nframes, self.f.getnframes())
38 self.assertEqual('NONE', self.f.getcomptype())
39 self.assertEqual(self.f.readframes(nframes), output)
40 self.f.close()
41
42 def test_ulaw(self):
43 self.f = sunau.open(TESTFN, 'w')
44 self.f.setnchannels(nchannels)
45 self.f.setsampwidth(sampwidth)
46 self.f.setframerate(framerate)
47 self.f.setcomptype('ULAW', '')
48 # u-law compression is lossy, therefore we can't expect non-zero data
49 # to come back unchanged.
50 output = b'\0' * nframes * nchannels * sampwidth
51 self.f.writeframes(output)
52 self.f.close()
53
54 self.f = sunau.open(TESTFN, 'rb')
55 self.assertEqual(nchannels, self.f.getnchannels())
56 self.assertEqual(sampwidth, self.f.getsampwidth())
57 self.assertEqual(framerate, self.f.getframerate())
58 self.assertEqual(nframes, self.f.getnframes())
59 self.assertEqual('ULAW', self.f.getcomptype())
60 self.assertEqual(self.f.readframes(nframes), output)
61 self.f.close()
62
Serhiy Storchakae06a8962013-09-04 00:43:03 +030063 def test_getparams(self):
64 self.f = sunau.open(TESTFN, 'w')
65 self.f.setnchannels(nchannels)
66 self.f.setsampwidth(sampwidth)
67 self.f.setframerate(framerate)
68 self.f.setcomptype('ULAW', '')
69 output = b'\0' * nframes * nchannels * sampwidth
70 self.f.writeframes(output)
71 self.f.close()
72
73 self.f = sunau.open(TESTFN, 'rb')
74 params = self.f.getparams()
75 self.assertEqual(params.nchannels, nchannels)
76 self.assertEqual(params.sampwidth, sampwidth)
77 self.assertEqual(params.framerate, framerate)
78 self.assertEqual(params.nframes, nframes)
79 self.assertEqual(params.comptype, 'ULAW')
80
81 dump = pickle.dumps(params)
82 self.assertEqual(pickle.loads(dump), params)
83
Serhiy Storchaka34d20132013-09-05 17:01:53 +030084 def test_write_context_manager_calls_close(self):
85 # Close checks for a minimum header and will raise an error
86 # if it is not set, so this proves that close is called.
87 with self.assertRaises(sunau.Error):
88 with sunau.open(TESTFN, 'wb') as f:
89 pass
90 with self.assertRaises(sunau.Error):
91 with open(TESTFN, 'wb') as testfile:
92 with sunau.open(testfile):
93 pass
Victor Stinner7f3652e2010-06-07 20:14:04 +000094
Serhiy Storchaka34d20132013-09-05 17:01:53 +030095 def test_context_manager_with_open_file(self):
96 with open(TESTFN, 'wb') as testfile:
97 with sunau.open(testfile) as f:
98 f.setnchannels(nchannels)
99 f.setsampwidth(sampwidth)
100 f.setframerate(framerate)
101 self.assertFalse(testfile.closed)
102 with open(TESTFN, 'rb') as testfile:
103 with sunau.open(testfile) as f:
104 self.assertFalse(f.getfp().closed)
105 params = f.getparams()
106 self.assertEqual(params[0], nchannels)
107 self.assertEqual(params[1], sampwidth)
108 self.assertEqual(params[2], framerate)
109 self.assertIsNone(f.getfp())
110 self.assertFalse(testfile.closed)
111
112 def test_context_manager_with_filename(self):
113 # If the file doesn't get closed, this test won't fail, but it will
114 # produce a resource leak warning.
115 with sunau.open(TESTFN, 'wb') as f:
116 f.setnchannels(nchannels)
117 f.setsampwidth(sampwidth)
118 f.setframerate(framerate)
119 with sunau.open(TESTFN) as f:
120 self.assertFalse(f.getfp().closed)
121 params = f.getparams()
122 self.assertEqual(params[0], nchannels)
123 self.assertEqual(params[1], sampwidth)
124 self.assertEqual(params[2], framerate)
125 self.assertIsNone(f.getfp())
126
Victor Stinner7f3652e2010-06-07 20:14:04 +0000127
128if __name__ == "__main__":
129 unittest.main()