# Copyright (C) 2003 Python Software Foundation import unittest import plistlib import os import datetime from test import support # This test data was generated through Cocoa's NSDictionary class TESTDATA = b""" aDate 2004-10-26T10:33:33Z aDict aFalseValue aTrueValue aUnicodeValue M\xc3\xa4ssig, Ma\xc3\x9f anotherString <hello & 'hi' there!> deeperDict a 17 b 32.5 c 1 2 text aFloat 0.5 aList A B 12 32.5 1 2 3 aString Doodah anEmptyDict anEmptyList anInt 728 nestedData PGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5r PgABAgM8bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5 IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5rPgABAgM8bG90cyBvZiBi aW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3Rz IG9mIGJpbmFyeSBndW5rPgABAgM8bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQID PGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAw== someData PGJpbmFyeSBndW5rPg== someMoreData PGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5rPgABAgM8 bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxs b3RzIG9mIGJpbmFyeSBndW5rPgABAgM8bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxv dHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5rPgABAgM8bG90 cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAw== \xc3\x85benraa That was a unicode key. """.replace(b" " * 8, b"\t") # Apple as well as plistlib.py output hard tabs class TestPlistlib(unittest.TestCase): def tearDown(self): try: os.unlink(support.TESTFN) except: pass def _create(self): pl = dict( aString="Doodah", aList=["A", "B", 12, 32.5, [1, 2, 3]], aFloat = 0.5, anInt = 728, aDict=dict( anotherString="", aUnicodeValue='M\xe4ssig, Ma\xdf', aTrueValue=True, aFalseValue=False, deeperDict=dict(a=17, b=32.5, c=[1, 2, "text"]), ), someData = plistlib.Data(b""), someMoreData = plistlib.Data(b"\0\1\2\3" * 10), nestedData = [plistlib.Data(b"\0\1\2\3" * 10)], aDate = datetime.datetime(2004, 10, 26, 10, 33, 33), anEmptyDict = dict(), anEmptyList = list() ) pl['\xc5benraa'] = "That was a unicode key." return pl def test_create(self): pl = self._create() self.assertEqual(pl["aString"], "Doodah") self.assertEqual(pl["aDict"]["aFalseValue"], False) def test_io(self): pl = self._create() plistlib.writePlist(pl, support.TESTFN) pl2 = plistlib.readPlist(support.TESTFN) self.assertEqual(dict(pl), dict(pl2)) def test_bytes(self): pl = self._create() data = plistlib.writePlistToBytes(pl) pl2 = plistlib.readPlistFromBytes(data) self.assertEqual(dict(pl), dict(pl2)) data2 = plistlib.writePlistToBytes(pl2) self.assertEqual(data, data2) def test_indentation_array(self): data = [[[[[[[[{'test': plistlib.Data(b'aaaaaa')}]]]]]]]] self.assertEqual(plistlib.readPlistFromBytes(plistlib.writePlistToBytes(data)), data) def test_indentation_dict(self): data = {'1': {'2': {'3': {'4': {'5': {'6': {'7': {'8': {'9': plistlib.Data(b'aaaaaa')}}}}}}}}} self.assertEqual(plistlib.readPlistFromBytes(plistlib.writePlistToBytes(data)), data) def test_indentation_dict_mix(self): data = {'1': {'2': [{'3': [[[[[{'test': plistlib.Data(b'aaaaaa')}]]]]]}]}} self.assertEqual(plistlib.readPlistFromBytes(plistlib.writePlistToBytes(data)), data) def test_appleformatting(self): pl = plistlib.readPlistFromBytes(TESTDATA) data = plistlib.writePlistToBytes(pl) self.assertEqual(data, TESTDATA, "generated data was not identical to Apple's output") def test_appleformattingfromliteral(self): pl = self._create() pl2 = plistlib.readPlistFromBytes(TESTDATA) self.assertEqual(dict(pl), dict(pl2), "generated data was not identical to Apple's output") def test_bytesio(self): from io import BytesIO b = BytesIO() pl = self._create() plistlib.writePlist(pl, b) pl2 = plistlib.readPlist(BytesIO(b.getvalue())) self.assertEqual(dict(pl), dict(pl2)) def test_controlcharacters(self): for i in range(128): c = chr(i) testString = "string containing %s" % c if i >= 32 or c in "\r\n\t": # \r, \n and \t are the only legal control chars in XML plistlib.writePlistToBytes(testString) else: self.assertRaises(ValueError, plistlib.writePlistToBytes, testString) def test_nondictroot(self): test1 = "abc" test2 = [1, 2, 3, "abc"] result1 = plistlib.readPlistFromBytes(plistlib.writePlistToBytes(test1)) result2 = plistlib.readPlistFromBytes(plistlib.writePlistToBytes(test2)) self.assertEqual(test1, result1) self.assertEqual(test2, result2) def test_invalidarray(self): for i in ["key inside an array", "key inside an array23", "key inside an array3"]: self.assertRaises(ValueError, plistlib.readPlistFromBytes, ("%s"%i).encode()) def test_invaliddict(self): for i in ["kcompound key", "single key", "missing key", "k1v15.3" "k1k2double key"]: self.assertRaises(ValueError, plistlib.readPlistFromBytes, ("%s"%i).encode()) self.assertRaises(ValueError, plistlib.readPlistFromBytes, ("%s"%i).encode()) def test_invalidinteger(self): self.assertRaises(ValueError, plistlib.readPlistFromBytes, b"not integer") def test_invalidreal(self): self.assertRaises(ValueError, plistlib.readPlistFromBytes, b"not real") def test_main(): support.run_unittest(TestPlistlib) if __name__ == '__main__': test_main()