plist.utf8 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,259 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>IMs</key>
6
+ <array>
7
+ <string>com.apple.syncservices:9583BE42-EC1A-4B3F-B248-7904BA60634B</string>
8
+ <string>com.apple.syncservices:2A222E96-4CC6-4320-BE0C-61D5F08C2E64</string>
9
+ <string>com.apple.syncservices:64DAA772-4558-49F8-9B87-C4A32D5E05C1</string>
10
+ <string>com.apple.syncservices:AF7C6884-B760-4E55-A4D5-B1B114C8A7DC</string>
11
+ <string>com.apple.syncservices:ECC7FAED-47D6-4DB9-8120-2F029C7D64C8</string>
12
+ <string>com.apple.syncservices:D704F079-F869-4613-9CFC-697C1976E8F4</string>
13
+ </array>
14
+ <key>URLs</key>
15
+ <array>
16
+ <string>com.apple.syncservices:5BA97109-F8E3-46A9-AF0B-5F8C093F49EA</string>
17
+ </array>
18
+ <key>com.apple.syncservices.RecordEntityName</key>
19
+ <string>com.apple.contacts.Contact</string>
20
+ <key>display as company</key>
21
+ <string>person</string>
22
+ <key>email addresses</key>
23
+ <array>
24
+ <string>com.apple.syncservices:B97DCC9C-5B00-4D38-AB06-4B7A5D6BC369</string>
25
+ <string>com.apple.syncservices:E508D679-43E1-49E2-B5D7-F14A8E48C067</string>
26
+ <string>com.apple.syncservices:C6478063-34A5-4CCB-BD41-1F131D56F7BD</string>
27
+ <string>com.apple.syncservices:2B3E352C-7831-4349-9A87-0FA4BD290515</string>
28
+ </array>
29
+ <key>first name</key>
30
+ <string>Mat</string>
31
+ <key>image</key>
32
+ <data>
33
+ /9j/4AAQSkZJRgABAQAAAQABAAD/7QAcUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAD/
34
+ 4g9ASUNDX1BST0ZJTEUAAQEAAA8wYXBwbAIAAABtbnRyUkdCIFhZWiAH1gAFABUAFAAg
35
+ AAZhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGxx
36
+ EHyAeZ4fvAacU+DW7cbVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5yWFla
37
+ AAABLAAAABRnWFlaAAABQAAAABRiWFlaAAABVAAAABR3dHB0AAABaAAAABRjaGFkAAAB
38
+ fAAAACxyVFJDAAABqAAAAA5nVFJDAAABuAAAAA5iVFJDAAAByAAAAA52Y2d0AAAB2AAA
39
+ BhJuZGluAAAH7AAABj5kZXNjAAAOLAAAAGRkc2NtAAAOkAAAAEhtbW9kAAAO2AAAAChj
40
+ cHJ0AAAPAAAAAC1YWVogAAAAAAAAZwIAADyoAAAJjlhZWiAAAAAAAABowAAAq7QAAB5o
41
+ WFlaIAAAAAAAACcUAAAXvwAAqy9YWVogAAAAAAAA81IAAQAAAAEWz3NmMzIAAAAAAAEM
42
+ QgAABd7///MmAAAHkgAA/ZH///ui///9owAAA9wAAMBsY3VydgAAAAAAAAABAc0AAGN1
43
+ cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAdmNndAAAAAAAAAAAAAMBAAACAAAA
44
+ JwCJARYBsAJsA0kESAV0BsgIPAnXC5YNcA9oEX0ToxXSGAwaJRvMHW4fDSCbIi8jtSUy
45
+ JqooFil9KuEsOS2MLtwwLTF1Mr80CDVINmQ3cjh8OYs6nTuuPL890j7lP/hBCUIUQxtE
46
+ H0UdRhhHDkf9SOhJ30r0TBxNQE5iT4NQo1HEUudUDVUxVlZXhFizWeRbGlxSXY9e0mAU
47
+ YVtin2PhZSBmWmeWaMtp/WsybGJtkm7Gb/hxKnJhc5502HYYd1d4mHmyerx7wHzFfc9+
48
+ 1n/egOmB94MHhBiFLIZCh1uIdomViraL2Yz+jiKPRZBokY+SrpPMlOWV/ZcVmCmZOJpG
49
+ m1ScX51onnCfdqB8oYGiiqORpJmlo6asp7yozancqumr9q0ArgWvBK/8sO+x2bK/s5q0
50
+ bLU7thK2/7f8uPu5+Lr0u+68573bvtS/0MDKwcnCzMPUxN/F88cLyCPJQMpFyyHL5cyq
51
+ zXHOOM79z8XQkdFe0izS/dPP1KbVf9Za1zjYF9j42dnamNtD2+TchN0i3cDeWt7z34zg
52
+ JuC/4Vjh8OKL4yfjxeRi5QHlouZN5wDnwOh76TPp5eqP6zPr0exj7PLtce3w7l/uzu8z
53
+ 75Pv9PBK8KDw+/GN8iny2fOD9Cn0yfVp9gj2qfdM9/H4ovla+hr66vvN/MD9yf7Q//8A
54
+ AAAUAEYAkQD0AYQCNQMQBA0FPAaSCA8Jtgt1DUoPNBEtEy0VNhcUGJ0aIhujHRsekB/+
55
+ IWIixCQgJWwmuyf8KTcqcCumLNUuAy8vME0xXjJoM200cjV3Nnk3ejh6OXg6dDtwPGc9
56
+ Wz5NPzxAKEEUQf1C5EPRRM9F1kbcR+JI50nsSvBL9kz+TgNPB1ANURNSF1MdVCJVJ1Yv
57
+ VzNYOVk/WkZbTlxTXV9ebF95YIxhomK9Y+BlBWYuZ15ol2nQaw5sTG2NbqdvsXC1cbpy
58
+ xHPLdNN13nbsd/x5DXohezd8UH1rfop/q4DOgfODF4Q6hV2GhIejiMGJ2oryjAqNHo4t
59
+ jzuQSZFUkl2TZZRrlXGWdpd/mIWZi5qQm5Gcl52dnp6fnKCdoZiilaOMpICldKZjp1Go
60
+ PKkkqg2q9KvarL6tqK6Rr4Cwb7FgslOzSbRDtT+2PLc8uD25QLpFu0m8Tb1Qvk2/O8Ah
61
+ wQrB9sLiw83EusWrxprHich5yWjKVctDzC/NGs4DzurPz9DE0cPSvNOx1J/VhtZm10HY
62
+ F9jp2brahttT3CHc8N3F3prfdOBR4Svh+uLA44XkSeUO5dPml+db6B/o4+mm6mrrLuvz
63
+ 7Lbteu4+7wPvx/CM8VDyFPLX8530YfUk9er2rfdx+DX4+vm9+oH7RfwK/M79kv5W/x7/
64
+ /wAAAAkAIABDAHAApwDoAVAB1gJ8Az4EHAUcBjUHXwiaCecLPAyVDekPExA2EVgSdBON
65
+ FKEVrxa6F7sYtRmoGpMbdxxWHTAeAh7QH5kgZCE6Ih8i/yPgJL0llyZvJ0UoGijpKbgq
66
+ hCtPLBcs3S2jLmgvLS/xMLQxdzI6MvYzrzRmNRo1yzZ8Ny432jiJOTk56jqdO1I8CjzF
67
+ PYQ+RD8IP8xAkUFVQhZC2UOZRFhFFkXQRopHQ0f0SKRJVEoBSqxLVUv5TJVNJ02tTjBO
68
+ tE85T75QRFDMUVZR41JyUwNTl1QtVMZVYVYAVqBXQlgDWO1Z81r7XANdCl4QXxpgKGE1
69
+ YkNjVGRqZYJmm2e4aNdp92sabEFtaW6Nb69wzXHrcwh0H3UwdkB3SXhQeVB6SntDfDV9
70
+ JX4Rfvp/44DPgciCx4PFhMCFuoauh5+IiYlyilqLPowfjQCN4I7Aj6GQg5FikkSTHpPt
71
+ lLWVgZZTlyeX/JjWmbaal5t6nGKdSZ4ynxygBqDvodeivqOjpJill6aSp4eoeKlkqkur
72
+ L6wTrPet3a7Gr7GwqLGgsqazr7S/tdu2+rgeuUS6aLuJvKu9yb7owATBIMI6w1TEb8WM
73
+ xqrHx8jpygjLLMxSzYHOxtAm0YvS/9SF1hTXstlr2zXdFt8M4SjjZOXI6G7rae7F8ur4
74
+ 1P//AABuZGluAAAAAAAABjYAAJQXAABYjQAAUbUAAI5iAAAoWwAAFqgAAFANAABUOQAC
75
+ o9cAAkAAAAFKPQADAQAAAgAAABQALQBGAF8AdwCOAKUAvADTAOkA/wEWASwBQwFZAXAB
76
+ hgGdAbQBywHjAfsCEwIsAkcCYgKGAqoC0AL3Ax8DSgN1A6EDzwP/BDEEZASZBNEFCgVF
77
+ BYEFwQYCBkYGigbQBxkHYweuB/sISwimCQgJbwnVCjwKpQsQC3wL6gxZDMsNPw24DjQO
78
+ tA85D8EQTxDjEXwSChKIEwUThxQKFI8VFxWfFikWsxc9F8oYWBjjGW8Z/BqJGxUbohwu
79
+ HLkdRR3SHl4e7R99IBAgpSE+IdYiciMSI7MkVCT5JaAmRCbsJ5UoPyjnKY0qNyrfK4cs
80
+ MizZLZkuaS8/MBgw7jHGMqIzfDRWNS82CDbjN7w4ljluOkc7Hjv1PMw9pD58P1dAM0ER
81
+ QexCz0O0RJ9FjEZ5R2tIYkleSlxLW0xfTWdOcE99UIxRnVKsU75U0VXjVvhYCFkXWipb
82
+ QVxYXXRelV++YPNiLmN6ZM1mNmewaTVqkmvTbQ9uUm+WcOByLHOBdNJ2IHdyeL96CXtO
83
+ fJF9zH8CgDuBb4KjhBWF2oehiWOLLYz1jrSQdpIwk+yVnZdOmPiaopxKnfOf66JEpKen
84
+ FqmZrCGurbFCs8+2V7jhu2C9qr/JwfzESsa7yV/MRs+Y02vX2tzd39riV+T157bqg+1L
85
+ 8AjykvT69yr5LfsI/L3+g///AAAAJwBHAGQAgACaALMAzADkAPwBEwErAUMBWwF0AYwB
86
+ pQG+AdgB8gIMAicCRQJkAooCsgLbAwUDMQNfA44DvgPxBCYEXASUBM4FDAVKBYsF0AYX
87
+ BmAGqgb4B0gHmgfuCEcIpgkKCXIJ3ApICrcLKQudDBQMjw0LDYwOEQ6ZDyYPthBJEOER
88
+ fBISEp4TLBO8FE8U4xV6FhMWrBdGF+UYhRklGcgabhsUG70caB0SHcEecB8hH9MghiE9
89
+ IfEipiNdJBEkxSV5Jikm2CeIKDYo4imKKjUq3iuHLDIs2S2ZLmkvPzAYMO4xxjKiM3w0
90
+ VjUvNgg24ze8OJY5bjpHOx479TzMPaQ+fD9XQDNBEUHsQs9DtESfRYxGeUdrSGJJXkpc
91
+ S1tMX01nTnBPfVCMUZ1SrFO/VNRV7FcKWCNZP1phW4hcrl3cXwpgQWF+YrxkBWVOZqFn
92
+ 92lPaqxsD21qbslwIHF5ctB0KHV5dsl4GXloerV8An1Pfpp/6oE8go6D9IV1hveIc4nw
93
+ i3OM8o5tj+2Rb5LxlHmWApePmR+atpxRnfOffKD2onukCqWmp1GpEKrbrLSulLCBsmu0
94
+ WbY3uBe57bu7va2/vMHSw+nGBMghykHMZ86P0LfS4dUP1z/Zctum3dvgFuJV5I7m1ekU
95
+ 617tqu/x8kT0lPbm+Tr7k/3w//8AAABVAIoAtwDhAQgBLgFUAXoBoAHGAe0CFQI+AmoC
96
+ ngLUAwwDRwOFA8UECQRQBJoE6gU+BZcF9wZcBscHOQexCDEIrAkhCZsKFwqZCyALqww6
97
+ DNANag4KDq8PWRAHELkRbxIqEugTsBSAFVoWOhcfGA0Y/BnsGtwbyxy3HaMejR96IGoh
98
+ YSJZI1skYCVvJoInpSjPKgArPSyHLf8vqzFXMwc0sTZUN/E5hjsVPJ4+JD9kQFtBUUJG
99
+ Qz9EOUU2Ri9HJ0giSR5KGEsPTAVM/U3zTuhP3lDUUclSu1OvVKdVoVaiV6NYpVmsWrtb
100
+ z1zlXgVfKGBVYYtixGQJZVBmomf3aU9qlWvTbRBuVW+ccOxyQ3OndQ52eXfveWl65nxo
101
+ feh/aYDxgnWEE4XQh4eJMIrbjICOGY+wkUaS1ZRolfiXipkdmrWcUZ3zn3yg9qJ5pAal
102
+ nac+qO2qoKxWrgmvubFlsv+0mbYct5+5GbqEu++9U761wBnBgcLvxFrFzMc+yLTKLMuo
103
+ zSbOpNAh0Z/TG9Sa1hTXlNkQ2oncAd1q3rvf+eE24m/jneTA5eDm/egT6STqJ+sm7CHt
104
+ E+4B7unv0PCp8X/yTfMZ8930m/VX9gT2svdW9+/4ifkZ+aL6K/qv+x37jPv6/Gj8tv0E
105
+ /VL9oP3v/jz+gf7G/wz/Uf+X/9z//wAAZGVzYwAAAAAAAAAKQ29sb3IgTENEAAAAAAAA
106
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
107
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1sdWMAAAAAAAAAAgAAAAxlblVTAAAAEgAAAChq
108
+ YUpQAAAADgAAADoAQwBvAGwAbwByACAATABDAEQwqzDpMPwAIABMAEMARG1tb2QAAAAA
109
+ AAAGEAAAnF4AAAAAwEuKAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENvcHlyaWdodCBB
110
+ cHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEB
111
+ AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBD
112
+ AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
113
+ AQEBAQEBAQEBAQEBAQH/wAARCAAwADADAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA
114
+ AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1Fh
115
+ ByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpT
116
+ VFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKz
117
+ tLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
118
+ AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC
119
+ AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2
120
+ Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaX
121
+ mJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP0
122
+ 9fb3+Pn6/9oADAMBAAIRAxEAPwDd+Bfxs/4J+ftC/EFPhp4M+LXjLQtVl8P6pr9trvxE
123
+ 8L2/gfwldRaU9tHPYw6/rU6WZ1OcXJms7F3R7tLe5WItKio3+XePyHPcBh3icwwjwNNT
124
+ VOVarjcsqSVacJTUZ4bB47FV4RajJzqTgqaulKXPKKf9XVcGklKhWpYyV1y0cHDGynGH
125
+ M06inVwdOnJKTimoTlJ/yuKcl+c/7cf7TXw68GfEbWvg38B/HWtXuv8AgbxrbC88aeCN
126
+ O8KeNtJ8W+HU0e2uJrRxr+lR6Vosa63Pc6Zd3Ed3dfakshcWN7FHPiT6nhzheq8PLM8f
127
+ gMFjcur4R0qOIzXHV8DQp4uT9+pg/wCzpvE4yrQWigoToXlKUoylGy+SzDGqVaOFpYzE
128
+ 4XE066nUw+Hw1PE1p0opcsayxEVRw8KjbV5WqWS5XGMtfCfCn/BSS1vtOvLddC0uw1zR
129
+ TJDqGha0ltZ6zfmFTvNlOHjsGuCzRiWAWjqpwkZLudmmZ+GWd4KeGcatOvgsYlKlmWFo
130
+ 1MVhKdOcrpVoPmqqPLGVqlRqLSTUVq3WD4jybEQrc/to4jDc6q4OtVp0a8pRi1aml7sr
131
+ N/BHmaejfb6p/ZM/bi+E3x2+I+g/CT4qG0+HHijxfr9h4X8K6tpkU2peHZ9Z1G4e2tLb
132
+ Wr28Nt9iW6uHtrRLq2t3t47uRvPEUTKEMdwRnmXU54jDqOIwMaEcR7edOFOpHl1nCph4
133
+ 1pzpxkmpU5pybjuklFvKnm+V4m0I1qlPFKrKnKjJ80XHRwdOr7OPPKLUlOL5UmlZ6tH7
134
+ LaX+wnruj+JtYQ6v4bg8O3TtdQX1tNfXGtz3S+X5Zvra4shbxoN9wD5NwTH8hwQ7AfNu
135
+ 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
219
+ zSptxk21dX5pWbuo3SS//9k=
220
+ </data>
221
+ <key>last name</key>
222
+ <string>Schaffer</string>
223
+ <key>phone numbers</key>
224
+ <array>
225
+ <string>com.apple.syncservices:64ED42EB-109B-43A9-BEFC-3463D944251A</string>
226
+ <string>com.apple.syncservices:FB7585EB-A3DE-46D5-920C-DF8028689BC5</string>
227
+ <string>com.apple.syncservices:020036FD-22B3-41C9-BC3D-CDA6083582C6</string>
228
+ <string>com.apple.syncservices:C6661518-90CA-45C7-A988-02F73B958951</string>
229
+ </array>
230
+ <key>primary URL</key>
231
+ <array>
232
+ <string>com.apple.syncservices:5BA97109-F8E3-46A9-AF0B-5F8C093F49EA</string>
233
+ </array>
234
+ <key>primary email address</key>
235
+ <array>
236
+ <string>com.apple.syncservices:B97DCC9C-5B00-4D38-AB06-4B7A5D6BC369</string>
237
+ </array>
238
+ <key>primary phone number</key>
239
+ <array>
240
+ <string>com.apple.syncservices:64ED42EB-109B-43A9-BEFC-3463D944251A</string>
241
+ </array>
242
+ <key>primary related name</key>
243
+ <array>
244
+ <string>com.apple.syncservices:CD0B7021-0228-4770-8FB0-3739479E9788</string>
245
+ </array>
246
+ <key>primary street address</key>
247
+ <array>
248
+ <string>com.apple.syncservices:377B9105-9D15-4F69-BCD6-B01E587F7760</string>
249
+ </array>
250
+ <key>related names</key>
251
+ <array>
252
+ <string>com.apple.syncservices:CD0B7021-0228-4770-8FB0-3739479E9788</string>
253
+ </array>
254
+ <key>street addresses</key>
255
+ <array>
256
+ <string>com.apple.syncservices:377B9105-9D15-4F69-BCD6-B01E587F7760</string>
257
+ </array>
258
+ </dict>
259
+ </plist>
@@ -0,0 +1,24 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>stringio</key>
6
+ <data>dGhpcyBpcyBhIHN0cmluZ2lvIG9iamVjdA==
7
+ </data>
8
+ <key>file</key>
9
+ <data>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
10
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
11
+ AAAAAAAAAAAAAA==
12
+ </data>
13
+ <key>io</key>
14
+ <data>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
15
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
16
+ AAAAAAAAAAAAAA==
17
+ </data>
18
+ <key>marshal</key>
19
+ <!-- The <data> element below contains a Ruby object which has been serialized with Marshal.dump. -->
20
+ <data>BAhvOhZNYXJzaGFsYWJsZU9iamVjdAY6CUBmb28iHnRoaXMgb2JqZWN0IHdh
21
+ cyBtYXJzaGFsZWQ=
22
+ </data>
23
+ </dict>
24
+ </plist>
@@ -0,0 +1,13 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>key</key>
6
+ <dict>
7
+ <key></key>
8
+ <string>1</string>
9
+ <key>subkey</key>
10
+ <string>2</string>
11
+ </dict>
12
+ </dict>
13
+ </plist>
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'plist'
5
+ require 'stringio'
6
+
7
+ class MarshalableObject
8
+ attr_accessor :foo
9
+
10
+ def initialize(str)
11
+ @foo = str
12
+ end
13
+ end
14
+
15
+ class TestDataElements < Test::Unit::TestCase
16
+
17
+ def setup
18
+ @result = Plist.parse_xml( 'test/assets/test_data_elements.plist' )
19
+ end
20
+
21
+ def test_data_object_header
22
+ expected = <<END
23
+ <!-- The <data> element below contains a Ruby object which has been serialized with Marshal.dump. -->
24
+ <data>
25
+ BAhvOhZNYXJzaGFsYWJsZU9iamVjdAY6CUBmb28iHnRoaXMgb2JqZWN0IHdhcyBtYXJz
26
+ aGFsZWQ=
27
+ </data>
28
+ END
29
+ expected_elements = expected.chomp.split( "\n" )
30
+
31
+ actual = Plist::Emit.dump( Object.new, false )
32
+ actual_elements = actual.chomp.split( "\n" )
33
+
34
+ # check for header
35
+ assert_equal expected_elements.shift, actual_elements.shift
36
+
37
+ # check for opening and closing data tags
38
+ assert_equal expected_elements.shift, actual_elements.shift
39
+ assert_equal expected_elements.pop, actual_elements.pop
40
+ end
41
+
42
+ def test_marshal_round_trip
43
+ expected = MarshalableObject.new('this object was marshaled')
44
+ actual = Plist.parse_xml( Plist::Emit.dump(expected, false) )
45
+
46
+ assert_kind_of expected.class, actual
47
+ assert_equal expected.foo, actual.foo
48
+ end
49
+
50
+ def test_generator_io_and_file
51
+ expected = <<END
52
+ <data>
53
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
54
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
55
+ </data>
56
+ END
57
+
58
+ expected.chomp!
59
+
60
+ fd = IO.sysopen('test/assets/example_data.bin')
61
+ io = IO.open(fd, 'r')
62
+
63
+ # File is a subclass of IO, so catching IO in the dispatcher should work for File as well...
64
+ f = File.open('test/assets/example_data.bin')
65
+
66
+ assert_equal expected, Plist::Emit.dump(io, false).chomp
67
+ assert_equal expected, Plist::Emit.dump(f, false).chomp
68
+
69
+ assert_instance_of StringIO, @result['io']
70
+ assert_instance_of StringIO, @result['file']
71
+
72
+ io.rewind
73
+ f.rewind
74
+
75
+ assert_equal io.read, @result['io'].read
76
+ assert_equal f.read, @result['file'].read
77
+
78
+ io.close
79
+ f.close
80
+ end
81
+
82
+ def test_generator_string_io
83
+ expected = <<END
84
+ <data>
85
+ dGhpcyBpcyBhIHN0cmluZ2lvIG9iamVjdA==
86
+ </data>
87
+ END
88
+
89
+ sio = StringIO.new('this is a stringio object')
90
+
91
+ assert_equal expected.chomp, Plist::Emit.dump(sio, false).chomp
92
+
93
+ assert_instance_of StringIO, @result['stringio']
94
+
95
+ sio.rewind
96
+ assert_equal sio.read, @result['stringio'].read
97
+ end
98
+
99
+ # this functionality is credited to Mat Schaffer,
100
+ # who discovered the plist with the data tag
101
+ # supplied the test data, and provided the parsing code.
102
+ def test_data
103
+ # test reading plist <data> elements
104
+ data = Plist::parse_xml("test/assets/example_data.plist");
105
+ assert_equal( File.open("test/assets/example_data.jpg"){|f| f.read }, data['image'].read )
106
+
107
+ # test writing data elements
108
+ expected = File.read("test/assets/example_data.plist")
109
+ result = data.to_plist
110
+ #File.open('result.plist', 'w') {|f|f.write(result)} # debug
111
+ assert_equal( expected, result )
112
+
113
+ # Test changing the <data> object in the plist to a StringIO and writing.
114
+ # This appears extraneous given that plist currently returns a StringIO,
115
+ # so the above writing test also flexes StringIO#to_plist_node.
116
+ # However, the interface promise is to return an IO, not a particular class.
117
+ # plist used to return Tempfiles, which was changed solely for performance reasons.
118
+ data['image'] = StringIO.new( File.read("test/assets/example_data.jpg"))
119
+
120
+ assert_equal(expected, data.to_plist )
121
+
122
+ end
123
+
124
+ end
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'plist'
5
+
6
+ class SerializableObject
7
+ attr_accessor :foo
8
+
9
+ def initialize(str)
10
+ @foo = str
11
+ end
12
+
13
+ def to_plist_node
14
+ return "<string>#{CGI::escapeHTML @foo}</string>"
15
+ end
16
+ end
17
+
18
+ class TestGenerator < Test::Unit::TestCase
19
+ def test_to_plist_vs_plist_emit_dump_no_envelope
20
+ source = [1, :b, true]
21
+
22
+ to_plist = source.to_plist(false)
23
+ plist_emit_dump = Plist::Emit.dump(source, false)
24
+
25
+ assert_equal to_plist, plist_emit_dump
26
+ end
27
+
28
+ def test_to_plist_vs_plist_emit_dump_with_envelope
29
+ source = [1, :b, true]
30
+
31
+ to_plist = source.to_plist
32
+ plist_emit_dump = Plist::Emit.dump(source)
33
+
34
+ assert_equal to_plist, plist_emit_dump
35
+ end
36
+
37
+ def test_dumping_serializable_object
38
+ str = 'this object implements #to_plist_node'
39
+ so = SerializableObject.new(str)
40
+
41
+ assert_equal "<string>#{str}</string>", Plist::Emit.dump(so, false)
42
+ end
43
+
44
+ def test_write_plist
45
+ data = [1, :two, {:c => 'dee'}]
46
+
47
+ data.save_plist('test.plist')
48
+ file = File.open('test.plist') {|f| f.read}
49
+
50
+ assert_equal file, data.to_plist
51
+
52
+ File.unlink('test.plist')
53
+ end
54
+
55
+ # The hash in this test was failing with 'hsh.keys.sort',
56
+ # we are making sure it works with 'hsh.keys.sort_by'.
57
+ def test_sorting_keys
58
+ hsh = {:key1 => 1, :key4 => 4, 'key2' => 2, :key3 => 3}
59
+ output = Plist::Emit.plist_node(hsh)
60
+ expected = <<-STR
61
+ <dict>
62
+ <key>key1</key>
63
+ <integer>1</integer>
64
+ <key>key2</key>
65
+ <integer>2</integer>
66
+ <key>key3</key>
67
+ <integer>3</integer>
68
+ <key>key4</key>
69
+ <integer>4</integer>
70
+ </dict>
71
+ STR
72
+
73
+ assert_equal expected, output.gsub(/[\t]/, "\s\s")
74
+ end
75
+ end
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'plist'
5
+
6
+ class TestGeneratorBasicTypes < Test::Unit::TestCase
7
+ def wrap(tag, content)
8
+ return "<#{tag}>#{content}</#{tag}>"
9
+ end
10
+
11
+ def test_strings
12
+ expected = wrap('string', 'testdata')
13
+
14
+ assert_equal expected, Plist::Emit.dump('testdata', false).chomp
15
+ assert_equal expected, Plist::Emit.dump(:testdata, false).chomp
16
+ end
17
+
18
+ def test_strings_with_escaping
19
+ expected = wrap('string', "&lt;Fish &amp; Chips&gt;")
20
+
21
+ assert_equal expected, Plist::Emit.dump('<Fish & Chips>', false).chomp
22
+ end
23
+
24
+ def test_integers
25
+ [42, 2376239847623987623, -8192].each do |i|
26
+ assert_equal wrap('integer', i), Plist::Emit.dump(i, false).chomp
27
+ end
28
+ end
29
+
30
+ def test_floats
31
+ [3.14159, -38.3897, 2398476293847.9823749872349980].each do |i|
32
+ assert_equal wrap('real', i), Plist::Emit.dump(i, false).chomp
33
+ end
34
+ end
35
+
36
+ def test_booleans
37
+ assert_equal "<true/>", Plist::Emit.dump(true, false).chomp
38
+ assert_equal "<false/>", Plist::Emit.dump(false, false).chomp
39
+ end
40
+
41
+ def test_time
42
+ test_time = Time.now
43
+ assert_equal wrap('date', test_time.utc.strftime('%Y-%m-%dT%H:%M:%SZ')), Plist::Emit.dump(test_time, false).chomp
44
+ end
45
+
46
+ def test_dates
47
+ test_date = Date.today
48
+ test_datetime = DateTime.now
49
+
50
+ assert_equal wrap('date', test_date.strftime('%Y-%m-%dT%H:%M:%SZ')), Plist::Emit.dump(test_date, false).chomp
51
+ assert_equal wrap('date', test_datetime.strftime('%Y-%m-%dT%H:%M:%SZ')), Plist::Emit.dump(test_datetime, false).chomp
52
+ end
53
+ end
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'plist'
5
+
6
+ class TestGeneratorCollections < Test::Unit::TestCase
7
+ def test_array
8
+ expected = <<END
9
+ <array>
10
+ <integer>1</integer>
11
+ <integer>2</integer>
12
+ <integer>3</integer>
13
+ </array>
14
+ END
15
+
16
+ assert_equal expected, [1,2,3].to_plist(false)
17
+ end
18
+
19
+ def test_empty_array
20
+ expected = <<END
21
+ <array/>
22
+ END
23
+
24
+ assert_equal expected, [].to_plist(false)
25
+ end
26
+
27
+ def test_hash
28
+ expected = <<END
29
+ <dict>
30
+ <key>abc</key>
31
+ <integer>123</integer>
32
+ <key>foo</key>
33
+ <string>bar</string>
34
+ </dict>
35
+ END
36
+ # thanks to recent changes in the generator code, hash keys are sorted before emission,
37
+ # so multi-element hash tests should be reliable. We're testing that here too.
38
+ assert_equal expected, {:foo => :bar, :abc => 123}.to_plist(false)
39
+ end
40
+
41
+ def test_empty_hash
42
+ expected = <<END
43
+ <dict/>
44
+ END
45
+
46
+ assert_equal expected, {}.to_plist(false)
47
+ end
48
+
49
+ def test_hash_with_array_element
50
+ expected = <<END
51
+ <dict>
52
+ <key>ary</key>
53
+ <array>
54
+ <integer>1</integer>
55
+ <string>b</string>
56
+ <string>3</string>
57
+ </array>
58
+ </dict>
59
+ END
60
+ assert_equal expected, {:ary => [1,:b,'3']}.to_plist(false)
61
+ end
62
+
63
+ def test_array_with_hash_element
64
+ expected = <<END
65
+ <array>
66
+ <dict>
67
+ <key>foo</key>
68
+ <string>bar</string>
69
+ </dict>
70
+ <string>b</string>
71
+ <integer>3</integer>
72
+ </array>
73
+ END
74
+
75
+ assert_equal expected, [{:foo => 'bar'}, :b, 3].to_plist(false)
76
+ end
77
+ end