def test_nondictroot(): test1 = "abc" test2 = [1, 2, 3, "abc"] result1 = plistlib.loads(plistlib.dumps(test1)) result2 = plistlib.loads(plistlib.dumps(test2)) assert test1 == result1 assert test2 == result2
def test_invalidarray(): for i in [ "<key>key inside an array</key>", "<key>key inside an array2</key><real>3</real>", "<true/><key>key inside an array3</key>", ]: with pytest.raises(ValueError): plistlib.loads( ("<plist><array>%s</array></plist>" % i).encode("utf-8"))
def test_skipkeys(): pl = {42: "aNumber", "snake": "aWord"} data = plistlib.dumps(pl, skipkeys=True, sort_keys=False) pl2 = plistlib.loads(data) assert pl2 == {"snake": "aWord"} fp = BytesIO() plistlib.dump(pl, fp, skipkeys=True, sort_keys=False) data = fp.getvalue() pl2 = plistlib.loads(fp.getvalue()) assert pl2 == {"snake": "aWord"}
def test_invaliddict(): for i in [ "<key><true/>k</key><string>compound key</string>", "<key>single key</key>", "<string>missing key</string>", "<key>k1</key><string>v1</string><real>5.3</real>" "<key>k1</key><key>k2</key><string>double key</string>", ]: with pytest.raises(ValueError): plistlib.loads(("<plist><dict>%s</dict></plist>" % i).encode()) with pytest.raises(ValueError): plistlib.loads( ("<plist><array><dict>%s</dict></array></plist>" % i).encode())
def test_list_members(): pl = {"first": [1, 2], "second": [1, 2], "third": [3, 4]} data = plistlib.dumps(pl) pl2 = plistlib.loads(data) assert pl2 == {"first": [1, 2], "second": [1, 2], "third": [3, 4]} assert pl2["first"] is not pl2["second"]
def test_int(pl): data = plistlib.dumps(pl) pl2 = plistlib.loads(data) assert isinstance(pl2, Integral) assert pl == pl2 data2 = plistlib.dumps(pl2) assert data == data2
def test_dict_members(): pl = {"first": {"a": 1}, "second": {"a": 1}, "third": {"b": 2}} data = plistlib.dumps(pl) pl2 = plistlib.loads(data) assert pl2 == {"first": {"a": 1}, "second": {"a": 1}, "third": {"b": 2}} assert pl2["first"] is not pl2["second"]
def test_bytes_data(DataClass, use_builtin_types): pl = DataClass(b"<binary gunk\0\1\2\3>") data = plistlib.dumps(pl, use_builtin_types=use_builtin_types) pl2 = plistlib.loads(data, use_builtin_types=use_builtin_types) assert isinstance(pl2, bytes if use_builtin_types else plistlib.Data) assert pl2 == pl data2 = plistlib.dumps(pl2, use_builtin_types=use_builtin_types) assert data == data2
def test_apple_formatting(parametrized_pl): # we also split base64 data into multiple lines differently: # both right-justify data to 76 chars, but Apple's treats tabs # as 8 spaces, whereas we use 2 spaces pl, use_builtin_types = parametrized_pl pl = plistlib.loads(TESTDATA, use_builtin_types=use_builtin_types) data = plistlib.dumps(pl, use_builtin_types=use_builtin_types) assert data == TESTDATA
def test_bytearray(use_builtin_types): DataClass = bytes if use_builtin_types else plistlib.Data pl = DataClass(b"<binary gunk\0\1\2\3>") array = bytearray(pl) if use_builtin_types else bytearray(pl.data) data = plistlib.dumps(array) pl2 = plistlib.loads(data, use_builtin_types=use_builtin_types) assert isinstance(pl2, DataClass) assert pl2 == pl data2 = plistlib.dumps(pl2, use_builtin_types=use_builtin_types) assert data == data2
def test_keysort(sort_keys): pl = collections.OrderedDict() pl["b"] = 1 pl["a"] = 2 pl["c"] = 3 data = plistlib.dumps(pl, sort_keys=sort_keys) pl2 = plistlib.loads(data, dict_type=collections.OrderedDict) assert dict(pl) == dict(pl2) if sort_keys: assert list(pl2.keys()) == ["a", "b", "c"] else: assert list(pl2.keys()) == ["b", "a", "c"]
def test_controlcharacters(): 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 data = plistlib.dumps(testString) # the stdlib's plistlib writer, as well as the elementtree # parser, always replace \r with \n inside string values; # lxml doesn't (the ctrl character is escaped), so it roundtrips if c != "\r" or etree._have_lxml: assert plistlib.loads(data) == testString else: with pytest.raises(ValueError): plistlib.dumps(testString)
def test_indentation_dict(): data = { "1": { "2": { "3": { "4": { "5": { "6": { "7": { "8": { "9": "aaaaaa" } } } } } } } } } assert plistlib.loads(plistlib.dumps(data)) == data
def test_writePlistToString(pl_no_builtin_types): data = plistlib.writePlistToString(pl_no_builtin_types) pl2 = plistlib.loads(data) assert pl2 == pl_no_builtin_types
def test_xml_encodings(parametrized_pl, xml_encoding, encoding, bom): pl, use_builtin_types = parametrized_pl data = TESTDATA.replace(b"UTF-8", xml_encoding) data = bom + data.decode("utf-8").encode(encoding) pl2 = plistlib.loads(data, use_builtin_types=use_builtin_types) assert pl == pl2
def test_invalidreal(): with pytest.raises(ValueError): plistlib.loads(b"<plist><integer>not real</integer></plist>")
def test_bytes_string(use_builtin_types): pl = b"some ASCII bytes" data = plistlib.dumps(pl, use_builtin_types=False) pl2 = plistlib.loads(data, use_builtin_types=use_builtin_types) assert isinstance(pl2, unicode) # it's always a <string> assert pl2 == pl.decode()
def test_indentation_array(): data = [[[[[[[[{"test": "aaaaaa"}]]]]]]]] assert plistlib.loads(plistlib.dumps(data)) == data
def test_apple_roundtrips(use_builtin_types): pl = plistlib.loads(TESTDATA, use_builtin_types=use_builtin_types) data = plistlib.dumps(pl, use_builtin_types=use_builtin_types) pl2 = plistlib.loads(data, use_builtin_types=use_builtin_types) data2 = plistlib.dumps(pl2, use_builtin_types=use_builtin_types) assert data == data2
def test_apple_formatting_fromliteral(parametrized_pl): pl, use_builtin_types = parametrized_pl pl2 = plistlib.loads(TESTDATA, use_builtin_types=use_builtin_types) assert pl == pl2
def test_load_use_builtin_types_default(): pl = plistlib.loads(TESTDATA) expected = plistlib.Data if PY2 else bytes assert isinstance(pl["someData"], expected)
def test_non_bmp_characters(): pl = {"python": "\U0001f40d"} data = plistlib.dumps(pl) assert plistlib.loads(data) == pl
def test_dump_use_builtin_types_default(pl_no_builtin_types): data = plistlib.dumps(pl_no_builtin_types) pl2 = plistlib.loads(data) expected = plistlib.Data if PY2 else bytes assert isinstance(pl2["someData"], expected) assert pl2 == pl_no_builtin_types
def test_indentation_dict_mix(): data = {"1": {"2": [{"3": [[[[[{"test": "aaaaaa"}]]]]]}]}} assert plistlib.loads(plistlib.dumps(data)) == data