diff options
Diffstat (limited to 'lib/python2.7/test/test_plistlib.py')
-rw-r--r-- | lib/python2.7/test/test_plistlib.py | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/lib/python2.7/test/test_plistlib.py b/lib/python2.7/test/test_plistlib.py new file mode 100644 index 0000000..7859ad0 --- /dev/null +++ b/lib/python2.7/test/test_plistlib.py @@ -0,0 +1,204 @@ +# 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() |