<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;"># 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 = """&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" \
"http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
        &lt;key&gt;aDate&lt;/key&gt;
        &lt;date&gt;2004-10-26T10:33:33Z&lt;/date&gt;
        &lt;key&gt;aDict&lt;/key&gt;
        &lt;dict&gt;
                &lt;key&gt;aFalseValue&lt;/key&gt;
                &lt;false/&gt;
                &lt;key&gt;aTrueValue&lt;/key&gt;
                &lt;true/&gt;
                &lt;key&gt;aUnicodeValue&lt;/key&gt;
                &lt;string&gt;M\xc3\xa4ssig, Ma\xc3\x9f&lt;/string&gt;
                &lt;key&gt;anotherString&lt;/key&gt;
                &lt;string&gt;&amp;lt;hello &amp;amp; 'hi' there!&amp;gt;&lt;/string&gt;
                &lt;key&gt;deeperDict&lt;/key&gt;
                &lt;dict&gt;
                        &lt;key&gt;a&lt;/key&gt;
                        &lt;integer&gt;17&lt;/integer&gt;
                        &lt;key&gt;b&lt;/key&gt;
                        &lt;real&gt;32.5&lt;/real&gt;
                        &lt;key&gt;c&lt;/key&gt;
                        &lt;array&gt;
                                &lt;integer&gt;1&lt;/integer&gt;
                                &lt;integer&gt;2&lt;/integer&gt;
                                &lt;string&gt;text&lt;/string&gt;
                        &lt;/array&gt;
                &lt;/dict&gt;
        &lt;/dict&gt;
        &lt;key&gt;aFloat&lt;/key&gt;
        &lt;real&gt;0.5&lt;/real&gt;
        &lt;key&gt;aList&lt;/key&gt;
        &lt;array&gt;
                &lt;string&gt;A&lt;/string&gt;
                &lt;string&gt;B&lt;/string&gt;
                &lt;integer&gt;12&lt;/integer&gt;
                &lt;real&gt;32.5&lt;/real&gt;
                &lt;array&gt;
                        &lt;integer&gt;1&lt;/integer&gt;
                        &lt;integer&gt;2&lt;/integer&gt;
                        &lt;integer&gt;3&lt;/integer&gt;
                &lt;/array&gt;
        &lt;/array&gt;
        &lt;key&gt;aString&lt;/key&gt;
        &lt;string&gt;Doodah&lt;/string&gt;
        &lt;key&gt;anInt&lt;/key&gt;
        &lt;integer&gt;728&lt;/integer&gt;
        &lt;key&gt;nestedData&lt;/key&gt;
        &lt;array&gt;
                &lt;data&gt;
                PGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5r
                PgABAgM8bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5
                IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5rPgABAgM8bG90cyBvZiBi
                aW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3Rz
                IG9mIGJpbmFyeSBndW5rPgABAgM8bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQID
                PGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAw==
                &lt;/data&gt;
        &lt;/array&gt;
        &lt;key&gt;someData&lt;/key&gt;
        &lt;data&gt;
        PGJpbmFyeSBndW5rPg==
        &lt;/data&gt;
        &lt;key&gt;someMoreData&lt;/key&gt;
        &lt;data&gt;
        PGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5rPgABAgM8
        bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxs
        b3RzIG9mIGJpbmFyeSBndW5rPgABAgM8bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxv
        dHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5rPgABAgM8bG90
        cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAw==
        &lt;/data&gt;
        &lt;key&gt;\xc3\x85benraa&lt;/key&gt;
        &lt;string&gt;That was a unicode key.&lt;/string&gt;
&lt;/dict&gt;
&lt;/plist&gt;
""".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="&lt;hello &amp; 'hi' there!&gt;",
                aUnicodeValue=u'M\xe4ssig, Ma\xdf',
                aTrueValue=True,
                aFalseValue=False,
                deeperDict=dict(a=17, b=32.5, c=[1, 2, "text"]),
            ),
            someData = plistlib.Data("&lt;binary gunk&gt;"),
            someMoreData = plistlib.Data("&lt;lots of binary gunk&gt;\0\1\2\3" * 10),
            nestedData = [plistlib.Data("&lt;lots of binary gunk&gt;\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 &gt;= 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()
</pre></body></html>