Add NEWS entry as per RDM's suggestion (the bug was actually present
[python.git] / Lib / test / test_plistlib.py
blob47630dce29764034ada6c9668962aa33413dd31a
1 # Copyright (C) 2003 Python Software Foundation
3 import unittest
4 import plistlib
5 import os
6 import datetime
7 from test import test_support
10 # This test data was generated through Cocoa's NSDictionary class
11 TESTDATA = """<?xml version="1.0" encoding="UTF-8"?>
12 <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \
13 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
14 <plist version="1.0">
15 <dict>
16 <key>aDate</key>
17 <date>2004-10-26T10:33:33Z</date>
18 <key>aDict</key>
19 <dict>
20 <key>aFalseValue</key>
21 <false/>
22 <key>aTrueValue</key>
23 <true/>
24 <key>aUnicodeValue</key>
25 <string>M\xc3\xa4ssig, Ma\xc3\x9f</string>
26 <key>anotherString</key>
27 <string>&lt;hello &amp; 'hi' there!&gt;</string>
28 <key>deeperDict</key>
29 <dict>
30 <key>a</key>
31 <integer>17</integer>
32 <key>b</key>
33 <real>32.5</real>
34 <key>c</key>
35 <array>
36 <integer>1</integer>
37 <integer>2</integer>
38 <string>text</string>
39 </array>
40 </dict>
41 </dict>
42 <key>aFloat</key>
43 <real>0.5</real>
44 <key>aList</key>
45 <array>
46 <string>A</string>
47 <string>B</string>
48 <integer>12</integer>
49 <real>32.5</real>
50 <array>
51 <integer>1</integer>
52 <integer>2</integer>
53 <integer>3</integer>
54 </array>
55 </array>
56 <key>aString</key>
57 <string>Doodah</string>
58 <key>anInt</key>
59 <integer>728</integer>
60 <key>nestedData</key>
61 <array>
62 <data>
63 PGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5r
64 PgABAgM8bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5
65 IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5rPgABAgM8bG90cyBvZiBi
66 aW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3Rz
67 IG9mIGJpbmFyeSBndW5rPgABAgM8bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQID
68 PGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAw==
69 </data>
70 </array>
71 <key>someData</key>
72 <data>
73 PGJpbmFyeSBndW5rPg==
74 </data>
75 <key>someMoreData</key>
76 <data>
77 PGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5rPgABAgM8
78 bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAzxs
79 b3RzIG9mIGJpbmFyeSBndW5rPgABAgM8bG90cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxv
80 dHMgb2YgYmluYXJ5IGd1bms+AAECAzxsb3RzIG9mIGJpbmFyeSBndW5rPgABAgM8bG90
81 cyBvZiBiaW5hcnkgZ3Vuaz4AAQIDPGxvdHMgb2YgYmluYXJ5IGd1bms+AAECAw==
82 </data>
83 <key>\xc3\x85benraa</key>
84 <string>That was a unicode key.</string>
85 </dict>
86 </plist>
87 """.replace(" " * 8, "\t") # Apple as well as plistlib.py output hard tabs
90 class TestPlistlib(unittest.TestCase):
92 def tearDown(self):
93 try:
94 os.unlink(test_support.TESTFN)
95 except:
96 pass
98 def _create(self):
99 pl = dict(
100 aString="Doodah",
101 aList=["A", "B", 12, 32.5, [1, 2, 3]],
102 aFloat = 0.5,
103 anInt = 728,
104 aDict=dict(
105 anotherString="<hello & 'hi' there!>",
106 aUnicodeValue=u'M\xe4ssig, Ma\xdf',
107 aTrueValue=True,
108 aFalseValue=False,
109 deeperDict=dict(a=17, b=32.5, c=[1, 2, "text"]),
111 someData = plistlib.Data("<binary gunk>"),
112 someMoreData = plistlib.Data("<lots of binary gunk>\0\1\2\3" * 10),
113 nestedData = [plistlib.Data("<lots of binary gunk>\0\1\2\3" * 10)],
114 aDate = datetime.datetime(2004, 10, 26, 10, 33, 33),
116 pl[u'\xc5benraa'] = "That was a unicode key."
117 return pl
119 def test_create(self):
120 pl = self._create()
121 self.assertEqual(pl["aString"], "Doodah")
122 self.assertEqual(pl["aDict"]["aFalseValue"], False)
124 def test_io(self):
125 pl = self._create()
126 plistlib.writePlist(pl, test_support.TESTFN)
127 pl2 = plistlib.readPlist(test_support.TESTFN)
128 self.assertEqual(dict(pl), dict(pl2))
130 def test_string(self):
131 pl = self._create()
132 data = plistlib.writePlistToString(pl)
133 pl2 = plistlib.readPlistFromString(data)
134 self.assertEqual(dict(pl), dict(pl2))
135 data2 = plistlib.writePlistToString(pl2)
136 self.assertEqual(data, data2)
138 def test_appleformatting(self):
139 pl = plistlib.readPlistFromString(TESTDATA)
140 data = plistlib.writePlistToString(pl)
141 self.assertEqual(data, TESTDATA,
142 "generated data was not identical to Apple's output")
144 def test_appleformattingfromliteral(self):
145 pl = self._create()
146 pl2 = plistlib.readPlistFromString(TESTDATA)
147 self.assertEqual(dict(pl), dict(pl2),
148 "generated data was not identical to Apple's output")
150 def test_stringio(self):
151 from StringIO import StringIO
152 f = StringIO()
153 pl = self._create()
154 plistlib.writePlist(pl, f)
155 pl2 = plistlib.readPlist(StringIO(f.getvalue()))
156 self.assertEqual(dict(pl), dict(pl2))
158 def test_cstringio(self):
159 from cStringIO import StringIO
160 f = StringIO()
161 pl = self._create()
162 plistlib.writePlist(pl, f)
163 pl2 = plistlib.readPlist(StringIO(f.getvalue()))
164 self.assertEqual(dict(pl), dict(pl2))
166 def test_controlcharacters(self):
167 for i in range(128):
168 c = chr(i)
169 testString = "string containing %s" % c
170 if i >= 32 or c in "\r\n\t":
171 # \r, \n and \t are the only legal control chars in XML
172 plistlib.writePlistToString(testString)
173 else:
174 self.assertRaises(ValueError,
175 plistlib.writePlistToString,
176 testString)
178 def test_nondictroot(self):
179 test1 = "abc"
180 test2 = [1, 2, 3, "abc"]
181 result1 = plistlib.readPlistFromString(plistlib.writePlistToString(test1))
182 result2 = plistlib.readPlistFromString(plistlib.writePlistToString(test2))
183 self.assertEqual(test1, result1)
184 self.assertEqual(test2, result2)
187 def test_main():
188 test_support.run_unittest(TestPlistlib)
191 if __name__ == '__main__':
192 test_main()