17db96d56Sopenharmony_cifrom test.support import findfile 27db96d56Sopenharmony_cifrom test.support.os_helper import TESTFN, unlink 37db96d56Sopenharmony_cifrom test.support.warnings_helper import check_no_resource_warning, import_deprecated 47db96d56Sopenharmony_ciimport unittest 57db96d56Sopenharmony_cifrom unittest import mock 67db96d56Sopenharmony_cifrom test import audiotests 77db96d56Sopenharmony_ciimport io 87db96d56Sopenharmony_ciimport sys 97db96d56Sopenharmony_ciimport struct 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ciaifc = import_deprecated("aifc") 137db96d56Sopenharmony_ciaudioop = import_deprecated("audioop") 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ciclass AifcTest(audiotests.AudioWriteTests, 177db96d56Sopenharmony_ci audiotests.AudioTestsWithSourceFile): 187db96d56Sopenharmony_ci module = aifc 197db96d56Sopenharmony_ci close_fd = True 207db96d56Sopenharmony_ci test_unseekable_read = None 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_ciclass AifcPCM8Test(AifcTest, unittest.TestCase): 247db96d56Sopenharmony_ci sndfilename = 'pluck-pcm8.aiff' 257db96d56Sopenharmony_ci sndfilenframes = 3307 267db96d56Sopenharmony_ci nchannels = 2 277db96d56Sopenharmony_ci sampwidth = 1 287db96d56Sopenharmony_ci framerate = 11025 297db96d56Sopenharmony_ci nframes = 48 307db96d56Sopenharmony_ci comptype = b'NONE' 317db96d56Sopenharmony_ci compname = b'not compressed' 327db96d56Sopenharmony_ci frames = bytes.fromhex("""\ 337db96d56Sopenharmony_ci 02FF 4B00 3104 8008 CB06 4803 BF01 03FE B8FA B4F3 29EB 1AE6 \ 347db96d56Sopenharmony_ci EDE4 C6E2 0EE0 EFE0 57E2 FBE8 13EF D8F7 97FB F5FC 08FB DFFB \ 357db96d56Sopenharmony_ci 11FA 3EFB BCFC 66FF CF04 4309 C10E 5112 EE17 8216 7F14 8012 \ 367db96d56Sopenharmony_ci 490E 520D EF0F CE0F E40C 630A 080A 2B0B 510E 8B11 B60E 440A \ 377db96d56Sopenharmony_ci """) 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ciclass AifcPCM16Test(AifcTest, unittest.TestCase): 417db96d56Sopenharmony_ci sndfilename = 'pluck-pcm16.aiff' 427db96d56Sopenharmony_ci sndfilenframes = 3307 437db96d56Sopenharmony_ci nchannels = 2 447db96d56Sopenharmony_ci sampwidth = 2 457db96d56Sopenharmony_ci framerate = 11025 467db96d56Sopenharmony_ci nframes = 48 477db96d56Sopenharmony_ci comptype = b'NONE' 487db96d56Sopenharmony_ci compname = b'not compressed' 497db96d56Sopenharmony_ci frames = bytes.fromhex("""\ 507db96d56Sopenharmony_ci 022EFFEA 4B5D00F6 311804EA 80E10840 CBE106B1 48A903F5 BFE601B2 036CFE7B \ 517db96d56Sopenharmony_ci B858FA3E B4B1F34F 299AEBCA 1A5DE6DA EDFAE491 C628E275 0E09E0B5 EF2AE029 \ 527db96d56Sopenharmony_ci 5758E271 FB35E83F 1376EF86 D82BF727 9790FB76 F5FAFC0F 0867FB9C DF30FB43 \ 537db96d56Sopenharmony_ci 117EFA36 3EE5FB5B BC79FCB1 66D9FF5D CF150412 431D097C C1BA0EC8 512112A1 \ 547db96d56Sopenharmony_ci EEE21753 82071665 7FFF1443 8004128F 49A20EAF 52BB0DBA EFB40F60 CE3C0FBF \ 557db96d56Sopenharmony_ci E4B30CEC 63430A5C 08C80A20 2BBB0B08 514A0E43 8BCF1139 B6F60EEB 44120A5E \ 567db96d56Sopenharmony_ci """) 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ciclass AifcPCM24Test(AifcTest, unittest.TestCase): 607db96d56Sopenharmony_ci sndfilename = 'pluck-pcm24.aiff' 617db96d56Sopenharmony_ci sndfilenframes = 3307 627db96d56Sopenharmony_ci nchannels = 2 637db96d56Sopenharmony_ci sampwidth = 3 647db96d56Sopenharmony_ci framerate = 11025 657db96d56Sopenharmony_ci nframes = 48 667db96d56Sopenharmony_ci comptype = b'NONE' 677db96d56Sopenharmony_ci compname = b'not compressed' 687db96d56Sopenharmony_ci frames = bytes.fromhex("""\ 697db96d56Sopenharmony_ci 022D65FFEB9D 4B5A0F00FA54 3113C304EE2B 80DCD6084303 \ 707db96d56Sopenharmony_ci CBDEC006B261 48A99803F2F8 BFE82401B07D 036BFBFE7B5D \ 717db96d56Sopenharmony_ci B85756FA3EC9 B4B055F3502B 299830EBCB62 1A5CA7E6D99A \ 727db96d56Sopenharmony_ci EDFA3EE491BD C625EBE27884 0E05A9E0B6CF EF2929E02922 \ 737db96d56Sopenharmony_ci 5758D8E27067 FB3557E83E16 1377BFEF8402 D82C5BF7272A \ 747db96d56Sopenharmony_ci 978F16FB7745 F5F865FC1013 086635FB9C4E DF30FCFB40EE \ 757db96d56Sopenharmony_ci 117FE0FA3438 3EE6B8FB5AC3 BC77A3FCB2F4 66D6DAFF5F32 \ 767db96d56Sopenharmony_ci CF13B9041275 431D69097A8C C1BB600EC74E 5120B912A2BA \ 777db96d56Sopenharmony_ci EEDF641754C0 8207001664B7 7FFFFF14453F 8000001294E6 \ 787db96d56Sopenharmony_ci 499C1B0EB3B2 52B73E0DBCA0 EFB2B20F5FD8 CE3CDB0FBE12 \ 797db96d56Sopenharmony_ci E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ 807db96d56Sopenharmony_ci 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ 817db96d56Sopenharmony_ci """) 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ciclass AifcPCM32Test(AifcTest, unittest.TestCase): 857db96d56Sopenharmony_ci sndfilename = 'pluck-pcm32.aiff' 867db96d56Sopenharmony_ci sndfilenframes = 3307 877db96d56Sopenharmony_ci nchannels = 2 887db96d56Sopenharmony_ci sampwidth = 4 897db96d56Sopenharmony_ci framerate = 11025 907db96d56Sopenharmony_ci nframes = 48 917db96d56Sopenharmony_ci comptype = b'NONE' 927db96d56Sopenharmony_ci compname = b'not compressed' 937db96d56Sopenharmony_ci frames = bytes.fromhex("""\ 947db96d56Sopenharmony_ci 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ 957db96d56Sopenharmony_ci CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ 967db96d56Sopenharmony_ci B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ 977db96d56Sopenharmony_ci EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ 987db96d56Sopenharmony_ci 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ 997db96d56Sopenharmony_ci 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ 1007db96d56Sopenharmony_ci 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ 1017db96d56Sopenharmony_ci CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ 1027db96d56Sopenharmony_ci EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ 1037db96d56Sopenharmony_ci 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ 1047db96d56Sopenharmony_ci E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ 1057db96d56Sopenharmony_ci 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ 1067db96d56Sopenharmony_ci """) 1077db96d56Sopenharmony_ci 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ciclass AifcULAWTest(AifcTest, unittest.TestCase): 1107db96d56Sopenharmony_ci sndfilename = 'pluck-ulaw.aifc' 1117db96d56Sopenharmony_ci sndfilenframes = 3307 1127db96d56Sopenharmony_ci nchannels = 2 1137db96d56Sopenharmony_ci sampwidth = 2 1147db96d56Sopenharmony_ci framerate = 11025 1157db96d56Sopenharmony_ci nframes = 48 1167db96d56Sopenharmony_ci comptype = b'ulaw' 1177db96d56Sopenharmony_ci compname = b'' 1187db96d56Sopenharmony_ci frames = bytes.fromhex("""\ 1197db96d56Sopenharmony_ci 022CFFE8 497C0104 307C04DC 8284083C CB84069C 497C03DC BE8401AC 036CFE74 \ 1207db96d56Sopenharmony_ci B684FA24 B684F344 2A7CEC04 19FCE704 EE04E504 C584E204 0E3CE104 EF04DF84 \ 1217db96d56Sopenharmony_ci 557CE204 FB24E804 12FCEF04 D784F744 9684FB64 F5C4FC24 083CFBA4 DF84FB24 \ 1227db96d56Sopenharmony_ci 11FCFA24 3E7CFB64 BA84FCB4 657CFF5C CF84041C 417C093C C1840EBC 517C12FC \ 1237db96d56Sopenharmony_ci EF0416FC 828415FC 7D7C13FC 828412FC 497C0EBC 517C0DBC F0040F3C CD840FFC \ 1247db96d56Sopenharmony_ci E5040CBC 617C0A3C 08BC0A3C 2C7C0B3C 517C0E3C 8A8410FC B6840EBC 457C0A3C \ 1257db96d56Sopenharmony_ci """) 1267db96d56Sopenharmony_ci if sys.byteorder != 'big': 1277db96d56Sopenharmony_ci frames = audioop.byteswap(frames, 2) 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci 1307db96d56Sopenharmony_ciclass AifcALAWTest(AifcTest, unittest.TestCase): 1317db96d56Sopenharmony_ci sndfilename = 'pluck-alaw.aifc' 1327db96d56Sopenharmony_ci sndfilenframes = 3307 1337db96d56Sopenharmony_ci nchannels = 2 1347db96d56Sopenharmony_ci sampwidth = 2 1357db96d56Sopenharmony_ci framerate = 11025 1367db96d56Sopenharmony_ci nframes = 48 1377db96d56Sopenharmony_ci comptype = b'alaw' 1387db96d56Sopenharmony_ci compname = b'' 1397db96d56Sopenharmony_ci frames = bytes.fromhex("""\ 1407db96d56Sopenharmony_ci 0230FFE8 4A0000F8 310004E0 82000840 CB0006A0 4A0003F0 BE0001A8 0370FE78 \ 1417db96d56Sopenharmony_ci BA00FA20 B600F340 2900EB80 1A80E680 ED80E480 C700E280 0E40E080 EF80E080 \ 1427db96d56Sopenharmony_ci 5600E280 FB20E880 1380EF80 D900F740 9600FB60 F5C0FC10 0840FBA0 DF00FB20 \ 1437db96d56Sopenharmony_ci 1180FA20 3F00FB60 BE00FCB0 6600FF58 CF000420 42000940 C1000EC0 52001280 \ 1447db96d56Sopenharmony_ci EE801780 82001680 7E001480 82001280 4A000EC0 52000DC0 EF800F40 CF000FC0 \ 1457db96d56Sopenharmony_ci E4800CC0 62000A40 08C00A40 2B000B40 52000E40 8A001180 B6000EC0 46000A40 \ 1467db96d56Sopenharmony_ci """) 1477db96d56Sopenharmony_ci if sys.byteorder != 'big': 1487db96d56Sopenharmony_ci frames = audioop.byteswap(frames, 2) 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ciclass AifcMiscTest(unittest.TestCase): 1527db96d56Sopenharmony_ci def test_skipunknown(self): 1537db96d56Sopenharmony_ci #Issue 2245 1547db96d56Sopenharmony_ci #This file contains chunk types aifc doesn't recognize. 1557db96d56Sopenharmony_ci f = aifc.open(findfile('Sine-1000Hz-300ms.aif')) 1567db96d56Sopenharmony_ci f.close() 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ci def test_close_opened_files_on_error(self): 1597db96d56Sopenharmony_ci non_aifc_file = findfile('pluck-pcm8.wav', subdir='audiodata') 1607db96d56Sopenharmony_ci with check_no_resource_warning(self): 1617db96d56Sopenharmony_ci with self.assertRaises(aifc.Error): 1627db96d56Sopenharmony_ci # Try opening a non-AIFC file, with the expectation that 1637db96d56Sopenharmony_ci # `aifc.open` will fail (without raising a ResourceWarning) 1647db96d56Sopenharmony_ci self.f = aifc.open(non_aifc_file, 'rb') 1657db96d56Sopenharmony_ci 1667db96d56Sopenharmony_ci # Aifc_write.initfp() won't raise in normal case. But some errors 1677db96d56Sopenharmony_ci # (e.g. MemoryError, KeyboardInterrupt, etc..) can happen. 1687db96d56Sopenharmony_ci with mock.patch.object(aifc.Aifc_write, 'initfp', 1697db96d56Sopenharmony_ci side_effect=RuntimeError): 1707db96d56Sopenharmony_ci with self.assertRaises(RuntimeError): 1717db96d56Sopenharmony_ci self.fout = aifc.open(TESTFN, 'wb') 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ci def test_params_added(self): 1747db96d56Sopenharmony_ci f = self.f = aifc.open(TESTFN, 'wb') 1757db96d56Sopenharmony_ci f.aiff() 1767db96d56Sopenharmony_ci f.setparams((1, 1, 1, 1, b'NONE', b'')) 1777db96d56Sopenharmony_ci f.close() 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci f = aifc.open(TESTFN, 'rb') 1807db96d56Sopenharmony_ci self.addCleanup(f.close) 1817db96d56Sopenharmony_ci params = f.getparams() 1827db96d56Sopenharmony_ci self.assertEqual(params.nchannels, f.getnchannels()) 1837db96d56Sopenharmony_ci self.assertEqual(params.sampwidth, f.getsampwidth()) 1847db96d56Sopenharmony_ci self.assertEqual(params.framerate, f.getframerate()) 1857db96d56Sopenharmony_ci self.assertEqual(params.nframes, f.getnframes()) 1867db96d56Sopenharmony_ci self.assertEqual(params.comptype, f.getcomptype()) 1877db96d56Sopenharmony_ci self.assertEqual(params.compname, f.getcompname()) 1887db96d56Sopenharmony_ci 1897db96d56Sopenharmony_ci def test_write_header_comptype_sampwidth(self): 1907db96d56Sopenharmony_ci for comptype in (b'ULAW', b'ulaw', b'ALAW', b'alaw', b'G722'): 1917db96d56Sopenharmony_ci fout = aifc.open(io.BytesIO(), 'wb') 1927db96d56Sopenharmony_ci fout.setnchannels(1) 1937db96d56Sopenharmony_ci fout.setframerate(1) 1947db96d56Sopenharmony_ci fout.setcomptype(comptype, b'') 1957db96d56Sopenharmony_ci fout.close() 1967db96d56Sopenharmony_ci self.assertEqual(fout.getsampwidth(), 2) 1977db96d56Sopenharmony_ci fout.initfp(None) 1987db96d56Sopenharmony_ci 1997db96d56Sopenharmony_ci def test_write_markers_values(self): 2007db96d56Sopenharmony_ci fout = aifc.open(io.BytesIO(), 'wb') 2017db96d56Sopenharmony_ci self.assertEqual(fout.getmarkers(), None) 2027db96d56Sopenharmony_ci fout.setmark(1, 0, b'foo1') 2037db96d56Sopenharmony_ci fout.setmark(1, 1, b'foo2') 2047db96d56Sopenharmony_ci self.assertEqual(fout.getmark(1), (1, 1, b'foo2')) 2057db96d56Sopenharmony_ci self.assertEqual(fout.getmarkers(), [(1, 1, b'foo2')]) 2067db96d56Sopenharmony_ci fout.initfp(None) 2077db96d56Sopenharmony_ci 2087db96d56Sopenharmony_ci def test_read_markers(self): 2097db96d56Sopenharmony_ci fout = self.fout = aifc.open(TESTFN, 'wb') 2107db96d56Sopenharmony_ci fout.aiff() 2117db96d56Sopenharmony_ci fout.setparams((1, 1, 1, 1, b'NONE', b'')) 2127db96d56Sopenharmony_ci fout.setmark(1, 0, b'odd') 2137db96d56Sopenharmony_ci fout.setmark(2, 0, b'even') 2147db96d56Sopenharmony_ci fout.writeframes(b'\x00') 2157db96d56Sopenharmony_ci fout.close() 2167db96d56Sopenharmony_ci f = aifc.open(TESTFN, 'rb') 2177db96d56Sopenharmony_ci self.addCleanup(f.close) 2187db96d56Sopenharmony_ci self.assertEqual(f.getmarkers(), [(1, 0, b'odd'), (2, 0, b'even')]) 2197db96d56Sopenharmony_ci self.assertEqual(f.getmark(1), (1, 0, b'odd')) 2207db96d56Sopenharmony_ci self.assertEqual(f.getmark(2), (2, 0, b'even')) 2217db96d56Sopenharmony_ci self.assertRaises(aifc.Error, f.getmark, 3) 2227db96d56Sopenharmony_ci 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_ciclass AIFCLowLevelTest(unittest.TestCase): 2257db96d56Sopenharmony_ci 2267db96d56Sopenharmony_ci def test_read_written(self): 2277db96d56Sopenharmony_ci def read_written(self, what): 2287db96d56Sopenharmony_ci f = io.BytesIO() 2297db96d56Sopenharmony_ci getattr(aifc, '_write_' + what)(f, x) 2307db96d56Sopenharmony_ci f.seek(0) 2317db96d56Sopenharmony_ci return getattr(aifc, '_read_' + what)(f) 2327db96d56Sopenharmony_ci for x in (-1, 0, 0.1, 1): 2337db96d56Sopenharmony_ci self.assertEqual(read_written(x, 'float'), x) 2347db96d56Sopenharmony_ci for x in (float('NaN'), float('Inf')): 2357db96d56Sopenharmony_ci self.assertEqual(read_written(x, 'float'), aifc._HUGE_VAL) 2367db96d56Sopenharmony_ci for x in (b'', b'foo', b'a' * 255): 2377db96d56Sopenharmony_ci self.assertEqual(read_written(x, 'string'), x) 2387db96d56Sopenharmony_ci for x in (-0x7FFFFFFF, -1, 0, 1, 0x7FFFFFFF): 2397db96d56Sopenharmony_ci self.assertEqual(read_written(x, 'long'), x) 2407db96d56Sopenharmony_ci for x in (0, 1, 0xFFFFFFFF): 2417db96d56Sopenharmony_ci self.assertEqual(read_written(x, 'ulong'), x) 2427db96d56Sopenharmony_ci for x in (-0x7FFF, -1, 0, 1, 0x7FFF): 2437db96d56Sopenharmony_ci self.assertEqual(read_written(x, 'short'), x) 2447db96d56Sopenharmony_ci for x in (0, 1, 0xFFFF): 2457db96d56Sopenharmony_ci self.assertEqual(read_written(x, 'ushort'), x) 2467db96d56Sopenharmony_ci 2477db96d56Sopenharmony_ci def test_read_raises(self): 2487db96d56Sopenharmony_ci f = io.BytesIO(b'\x00') 2497db96d56Sopenharmony_ci self.assertRaises(EOFError, aifc._read_ulong, f) 2507db96d56Sopenharmony_ci self.assertRaises(EOFError, aifc._read_long, f) 2517db96d56Sopenharmony_ci self.assertRaises(EOFError, aifc._read_ushort, f) 2527db96d56Sopenharmony_ci self.assertRaises(EOFError, aifc._read_short, f) 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ci def test_write_long_string_raises(self): 2557db96d56Sopenharmony_ci f = io.BytesIO() 2567db96d56Sopenharmony_ci with self.assertRaises(ValueError): 2577db96d56Sopenharmony_ci aifc._write_string(f, b'too long' * 255) 2587db96d56Sopenharmony_ci 2597db96d56Sopenharmony_ci def test_wrong_open_mode(self): 2607db96d56Sopenharmony_ci with self.assertRaises(aifc.Error): 2617db96d56Sopenharmony_ci aifc.open(TESTFN, 'wrong_mode') 2627db96d56Sopenharmony_ci 2637db96d56Sopenharmony_ci def test_read_wrong_form(self): 2647db96d56Sopenharmony_ci b1 = io.BytesIO(b'WRNG' + struct.pack('>L', 0)) 2657db96d56Sopenharmony_ci b2 = io.BytesIO(b'FORM' + struct.pack('>L', 4) + b'WRNG') 2667db96d56Sopenharmony_ci self.assertRaises(aifc.Error, aifc.open, b1) 2677db96d56Sopenharmony_ci self.assertRaises(aifc.Error, aifc.open, b2) 2687db96d56Sopenharmony_ci 2697db96d56Sopenharmony_ci def test_read_no_comm_chunk(self): 2707db96d56Sopenharmony_ci b = io.BytesIO(b'FORM' + struct.pack('>L', 4) + b'AIFF') 2717db96d56Sopenharmony_ci self.assertRaises(aifc.Error, aifc.open, b) 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci def test_read_no_ssnd_chunk(self): 2747db96d56Sopenharmony_ci b = b'FORM' + struct.pack('>L', 4) + b'AIFC' 2757db96d56Sopenharmony_ci b += b'COMM' + struct.pack('>LhlhhLL', 38, 1, 0, 8, 2767db96d56Sopenharmony_ci 0x4000 | 12, 11025<<18, 0) 2777db96d56Sopenharmony_ci b += b'NONE' + struct.pack('B', 14) + b'not compressed' + b'\x00' 2787db96d56Sopenharmony_ci with self.assertRaisesRegex(aifc.Error, 'COMM chunk and/or SSND chunk' 2797db96d56Sopenharmony_ci ' missing'): 2807db96d56Sopenharmony_ci aifc.open(io.BytesIO(b)) 2817db96d56Sopenharmony_ci 2827db96d56Sopenharmony_ci def test_read_wrong_compression_type(self): 2837db96d56Sopenharmony_ci b = b'FORM' + struct.pack('>L', 4) + b'AIFC' 2847db96d56Sopenharmony_ci b += b'COMM' + struct.pack('>LhlhhLL', 23, 1, 0, 8, 2857db96d56Sopenharmony_ci 0x4000 | 12, 11025<<18, 0) 2867db96d56Sopenharmony_ci b += b'WRNG' + struct.pack('B', 0) 2877db96d56Sopenharmony_ci self.assertRaises(aifc.Error, aifc.open, io.BytesIO(b)) 2887db96d56Sopenharmony_ci 2897db96d56Sopenharmony_ci def test_read_wrong_number_of_channels(self): 2907db96d56Sopenharmony_ci for nchannels in 0, -1: 2917db96d56Sopenharmony_ci b = b'FORM' + struct.pack('>L', 4) + b'AIFC' 2927db96d56Sopenharmony_ci b += b'COMM' + struct.pack('>LhlhhLL', 38, nchannels, 0, 8, 2937db96d56Sopenharmony_ci 0x4000 | 12, 11025<<18, 0) 2947db96d56Sopenharmony_ci b += b'NONE' + struct.pack('B', 14) + b'not compressed' + b'\x00' 2957db96d56Sopenharmony_ci b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8 2967db96d56Sopenharmony_ci with self.assertRaisesRegex(aifc.Error, 'bad # of channels'): 2977db96d56Sopenharmony_ci aifc.open(io.BytesIO(b)) 2987db96d56Sopenharmony_ci 2997db96d56Sopenharmony_ci def test_read_wrong_sample_width(self): 3007db96d56Sopenharmony_ci for sampwidth in 0, -1: 3017db96d56Sopenharmony_ci b = b'FORM' + struct.pack('>L', 4) + b'AIFC' 3027db96d56Sopenharmony_ci b += b'COMM' + struct.pack('>LhlhhLL', 38, 1, 0, sampwidth, 3037db96d56Sopenharmony_ci 0x4000 | 12, 11025<<18, 0) 3047db96d56Sopenharmony_ci b += b'NONE' + struct.pack('B', 14) + b'not compressed' + b'\x00' 3057db96d56Sopenharmony_ci b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8 3067db96d56Sopenharmony_ci with self.assertRaisesRegex(aifc.Error, 'bad sample width'): 3077db96d56Sopenharmony_ci aifc.open(io.BytesIO(b)) 3087db96d56Sopenharmony_ci 3097db96d56Sopenharmony_ci def test_read_wrong_marks(self): 3107db96d56Sopenharmony_ci b = b'FORM' + struct.pack('>L', 4) + b'AIFF' 3117db96d56Sopenharmony_ci b += b'COMM' + struct.pack('>LhlhhLL', 18, 1, 0, 8, 3127db96d56Sopenharmony_ci 0x4000 | 12, 11025<<18, 0) 3137db96d56Sopenharmony_ci b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8 3147db96d56Sopenharmony_ci b += b'MARK' + struct.pack('>LhB', 3, 1, 1) 3157db96d56Sopenharmony_ci with self.assertWarns(UserWarning) as cm: 3167db96d56Sopenharmony_ci f = aifc.open(io.BytesIO(b)) 3177db96d56Sopenharmony_ci self.assertEqual(str(cm.warning), 'Warning: MARK chunk contains ' 3187db96d56Sopenharmony_ci 'only 0 markers instead of 1') 3197db96d56Sopenharmony_ci self.assertEqual(f.getmarkers(), None) 3207db96d56Sopenharmony_ci 3217db96d56Sopenharmony_ci def test_read_comm_kludge_compname_even(self): 3227db96d56Sopenharmony_ci b = b'FORM' + struct.pack('>L', 4) + b'AIFC' 3237db96d56Sopenharmony_ci b += b'COMM' + struct.pack('>LhlhhLL', 18, 1, 0, 8, 3247db96d56Sopenharmony_ci 0x4000 | 12, 11025<<18, 0) 3257db96d56Sopenharmony_ci b += b'NONE' + struct.pack('B', 4) + b'even' + b'\x00' 3267db96d56Sopenharmony_ci b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8 3277db96d56Sopenharmony_ci with self.assertWarns(UserWarning) as cm: 3287db96d56Sopenharmony_ci f = aifc.open(io.BytesIO(b)) 3297db96d56Sopenharmony_ci self.assertEqual(str(cm.warning), 'Warning: bad COMM chunk size') 3307db96d56Sopenharmony_ci self.assertEqual(f.getcompname(), b'even') 3317db96d56Sopenharmony_ci 3327db96d56Sopenharmony_ci def test_read_comm_kludge_compname_odd(self): 3337db96d56Sopenharmony_ci b = b'FORM' + struct.pack('>L', 4) + b'AIFC' 3347db96d56Sopenharmony_ci b += b'COMM' + struct.pack('>LhlhhLL', 18, 1, 0, 8, 3357db96d56Sopenharmony_ci 0x4000 | 12, 11025<<18, 0) 3367db96d56Sopenharmony_ci b += b'NONE' + struct.pack('B', 3) + b'odd' 3377db96d56Sopenharmony_ci b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8 3387db96d56Sopenharmony_ci with self.assertWarns(UserWarning) as cm: 3397db96d56Sopenharmony_ci f = aifc.open(io.BytesIO(b)) 3407db96d56Sopenharmony_ci self.assertEqual(str(cm.warning), 'Warning: bad COMM chunk size') 3417db96d56Sopenharmony_ci self.assertEqual(f.getcompname(), b'odd') 3427db96d56Sopenharmony_ci 3437db96d56Sopenharmony_ci def test_write_params_raises(self): 3447db96d56Sopenharmony_ci fout = aifc.open(io.BytesIO(), 'wb') 3457db96d56Sopenharmony_ci wrong_params = (0, 0, 0, 0, b'WRNG', '') 3467db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setparams, wrong_params) 3477db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.getparams) 3487db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setnchannels, 0) 3497db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.getnchannels) 3507db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setsampwidth, 0) 3517db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.getsampwidth) 3527db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setframerate, 0) 3537db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.getframerate) 3547db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setcomptype, b'WRNG', '') 3557db96d56Sopenharmony_ci fout.aiff() 3567db96d56Sopenharmony_ci fout.setnchannels(1) 3577db96d56Sopenharmony_ci fout.setsampwidth(1) 3587db96d56Sopenharmony_ci fout.setframerate(1) 3597db96d56Sopenharmony_ci fout.setnframes(1) 3607db96d56Sopenharmony_ci fout.writeframes(b'\x00') 3617db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setparams, (1, 1, 1, 1, 1, 1)) 3627db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setnchannels, 1) 3637db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setsampwidth, 1) 3647db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setframerate, 1) 3657db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setnframes, 1) 3667db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setcomptype, b'NONE', '') 3677db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.aiff) 3687db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.aifc) 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_ci def test_write_params_singles(self): 3717db96d56Sopenharmony_ci fout = aifc.open(io.BytesIO(), 'wb') 3727db96d56Sopenharmony_ci fout.aifc() 3737db96d56Sopenharmony_ci fout.setnchannels(1) 3747db96d56Sopenharmony_ci fout.setsampwidth(2) 3757db96d56Sopenharmony_ci fout.setframerate(3) 3767db96d56Sopenharmony_ci fout.setnframes(4) 3777db96d56Sopenharmony_ci fout.setcomptype(b'NONE', b'name') 3787db96d56Sopenharmony_ci self.assertEqual(fout.getnchannels(), 1) 3797db96d56Sopenharmony_ci self.assertEqual(fout.getsampwidth(), 2) 3807db96d56Sopenharmony_ci self.assertEqual(fout.getframerate(), 3) 3817db96d56Sopenharmony_ci self.assertEqual(fout.getnframes(), 0) 3827db96d56Sopenharmony_ci self.assertEqual(fout.tell(), 0) 3837db96d56Sopenharmony_ci self.assertEqual(fout.getcomptype(), b'NONE') 3847db96d56Sopenharmony_ci self.assertEqual(fout.getcompname(), b'name') 3857db96d56Sopenharmony_ci fout.writeframes(b'\x00' * 4 * fout.getsampwidth() * fout.getnchannels()) 3867db96d56Sopenharmony_ci self.assertEqual(fout.getnframes(), 4) 3877db96d56Sopenharmony_ci self.assertEqual(fout.tell(), 4) 3887db96d56Sopenharmony_ci 3897db96d56Sopenharmony_ci def test_write_params_bunch(self): 3907db96d56Sopenharmony_ci fout = aifc.open(io.BytesIO(), 'wb') 3917db96d56Sopenharmony_ci fout.aifc() 3927db96d56Sopenharmony_ci p = (1, 2, 3, 4, b'NONE', b'name') 3937db96d56Sopenharmony_ci fout.setparams(p) 3947db96d56Sopenharmony_ci self.assertEqual(fout.getparams(), p) 3957db96d56Sopenharmony_ci fout.initfp(None) 3967db96d56Sopenharmony_ci 3977db96d56Sopenharmony_ci def test_write_header_raises(self): 3987db96d56Sopenharmony_ci fout = aifc.open(io.BytesIO(), 'wb') 3997db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.close) 4007db96d56Sopenharmony_ci fout = aifc.open(io.BytesIO(), 'wb') 4017db96d56Sopenharmony_ci fout.setnchannels(1) 4027db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.close) 4037db96d56Sopenharmony_ci fout = aifc.open(io.BytesIO(), 'wb') 4047db96d56Sopenharmony_ci fout.setnchannels(1) 4057db96d56Sopenharmony_ci fout.setsampwidth(1) 4067db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.close) 4077db96d56Sopenharmony_ci 4087db96d56Sopenharmony_ci def test_write_header_comptype_raises(self): 4097db96d56Sopenharmony_ci for comptype in (b'ULAW', b'ulaw', b'ALAW', b'alaw', b'G722'): 4107db96d56Sopenharmony_ci fout = aifc.open(io.BytesIO(), 'wb') 4117db96d56Sopenharmony_ci fout.setsampwidth(1) 4127db96d56Sopenharmony_ci fout.setcomptype(comptype, b'') 4137db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.close) 4147db96d56Sopenharmony_ci fout.initfp(None) 4157db96d56Sopenharmony_ci 4167db96d56Sopenharmony_ci def test_write_markers_raises(self): 4177db96d56Sopenharmony_ci fout = aifc.open(io.BytesIO(), 'wb') 4187db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setmark, 0, 0, b'') 4197db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setmark, 1, -1, b'') 4207db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.setmark, 1, 0, None) 4217db96d56Sopenharmony_ci self.assertRaises(aifc.Error, fout.getmark, 1) 4227db96d56Sopenharmony_ci fout.initfp(None) 4237db96d56Sopenharmony_ci 4247db96d56Sopenharmony_ci def test_write_aiff_by_extension(self): 4257db96d56Sopenharmony_ci sampwidth = 2 4267db96d56Sopenharmony_ci filename = TESTFN + '.aiff' 4277db96d56Sopenharmony_ci fout = self.fout = aifc.open(filename, 'wb') 4287db96d56Sopenharmony_ci self.addCleanup(unlink, filename) 4297db96d56Sopenharmony_ci fout.setparams((1, sampwidth, 1, 1, b'ULAW', b'')) 4307db96d56Sopenharmony_ci frames = b'\x00' * fout.getnchannels() * sampwidth 4317db96d56Sopenharmony_ci fout.writeframes(frames) 4327db96d56Sopenharmony_ci fout.close() 4337db96d56Sopenharmony_ci f = self.f = aifc.open(filename, 'rb') 4347db96d56Sopenharmony_ci self.assertEqual(f.getcomptype(), b'NONE') 4357db96d56Sopenharmony_ci f.close() 4367db96d56Sopenharmony_ci 4377db96d56Sopenharmony_ci 4387db96d56Sopenharmony_ciif __name__ == "__main__": 4397db96d56Sopenharmony_ci unittest.main() 440