/Lib/test/test_plistlib.py
http://unladen-swallow.googlecode.com/ · Python · 192 lines · 169 code · 20 blank · 3 comment · 6 complexity · 72a6ae775e1de634b41a0433fbcb2d0b MD5 · raw file
- # 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 Computer//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_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()