# Copyright (C) 2003 Python Software Foundation import unittest import plistlib import os import datetime from test import test_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 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(test_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), ) 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, test_support.TESTFN) pl2 = plistlib.readPlist(test_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_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_main(): test_support.run_unittest(TestPlistlib) if __name__ == '__main__': test_main()