# 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 = """<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" \ "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>aDate</key> <date>2004-10-26T10:33:33Z</date> <key>aDict</key> <dict> <key>aFalseValue</key> <false/> <key>aTrueValue</key> <true/> <key>aUnicodeValue</key> <string>M\xc3\xa4ssig, Ma\xc3\x9f</string> <key>anotherString</key> <string><hello & 'hi' there!></string> <key>deeperDict</key> <dict> <key>a</key> <integer>17</integer> <key>b</key> <real>32.5</real> <key>c</key> <array> <integer>1</integer> <integer>2</integer> <string>text</string> </array> </dict> </dict> <key>aFloat</key> <real>0.5</real> <key>aList</key> <array> <string>A</string> <string>B</string> <integer>12</integer> <real>32.5</real> <array> <integer>1</integer> <integer>2</integer> <integer>3</integer> </array> </array> <key>aString</key> <string>Doodah</string> <key>anInt</key> <integer>728</integer> <key>nestedData</key> <array> <data> PGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5r PgABAgM8bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5 IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5rPgABAgM8bG90cyBvZiBi aW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3Rz IG9mIGJpbmFyeSBndW5rPgABAgM8bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQID PGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAw== </data> </array> <key>someData</key> <data> PGJpbmFyeSBndW5rPg== </data> <key>someMoreData</key> <data> PGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5rPgABAgM8 bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxs b3RzIG9mIGJpbmFyeSBndW5rPgABAgM8bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxv dHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5rPgABAgM8bG90 cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAw== </data> <key>\xc3\x85benraa</key> <string>That was a unicode key.</string> </dict> </plist> """.replace(" " * 8, "\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="<hello & 'hi' there!>", aUnicodeValue=u'M\xe4ssig, Ma\xdf', aTrueValue=True, aFalseValue=False, deeperDict=dict(a=17, b=32.5, c=[1, 2, "text"]), ), someData = plistlib.Data("<binary gunk>"), someMoreData = plistlib.Data("<lots of binary gunk>\0\1\2\3" * 10), nestedData = [plistlib.Data("<lots of binary gunk>\0\1\2\3" * 10)], aDate = datetime.datetime(2004, 10, 26, 10, 33, 33), ) pl[u'\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_string(self): pl = self._create() data = plistlib.writePlistToString(pl) pl2 = plistlib.readPlistFromString(data) self.assertEqual(dict(pl), dict(pl2)) data2 = plistlib.writePlistToString(pl2) self.assertEqual(data, data2) def test_indentation_array(self): data = [[[[[[[[{'test': plistlib.Data(b'aaaaaa')}]]]]]]]] self.assertEqual(plistlib.readPlistFromString(plistlib.writePlistToString(data)), data) def test_indentation_dict(self): data = {'1': {'2': {'3': {'4': {'5': {'6': {'7': {'8': {'9': plistlib.Data(b'aaaaaa')}}}}}}}}} self.assertEqual(plistlib.readPlistFromString(plistlib.writePlistToString(data)), data) def test_indentation_dict_mix(self): data = {'1': {'2': [{'3': [[[[[{'test': plistlib.Data(b'aaaaaa')}]]]]]}]}} self.assertEqual(plistlib.readPlistFromString(plistlib.writePlistToString(data)), data) def test_appleformatting(self): pl = plistlib.readPlistFromString(TESTDATA) data = plistlib.writePlistToString(pl) self.assertEqual(data, TESTDATA, "generated data was not identical to Apple's output") def test_appleformattingfromliteral(self): pl = self._create() pl2 = plistlib.readPlistFromString(TESTDATA) self.assertEqual(dict(pl), dict(pl2), "generated data was not identical to Apple's output") def test_stringio(self): from StringIO import StringIO f = StringIO() pl = self._create() plistlib.writePlist(pl, f) pl2 = plistlib.readPlist(StringIO(f.getvalue())) self.assertEqual(dict(pl), dict(pl2)) def test_cstringio(self): from cStringIO import StringIO f = StringIO() pl = self._create() plistlib.writePlist(pl, f) pl2 = plistlib.readPlist(StringIO(f.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.writePlistToString(testString) else: self.assertRaises(ValueError, plistlib.writePlistToString, testString) def test_nondictroot(self): test1 = "abc" test2 = [1, 2, 3, "abc"] result1 = plistlib.readPlistFromString(plistlib.writePlistToString(test1)) result2 = plistlib.readPlistFromString(plistlib.writePlistToString(test2)) self.assertEqual(test1, result1) self.assertEqual(test2, result2) def test_main(): test_support.run_unittest(TestPlistlib) if __name__ == '__main__': test_main()