| |
| var assert = require('assert'); |
| var parse = require('../').parse; |
| var multiline = require('multiline'); |
| |
| describe('plist', function () { |
| |
| describe('parse()', function () { |
| |
| it('should parse a minimal <string> node into a String', function () { |
| var parsed = parse('<plist><string>Hello World!</string></plist>'); |
| assert.strictEqual(parsed, 'Hello World!'); |
| }); |
| |
| it('should parse a full XML <string> node into a String', function () { |
| var xml = multiline(function () {/* |
| <?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"> |
| <string>gray</string> |
| </plist> |
| */}); |
| var parsed = parse(xml); |
| assert.strictEqual(parsed, 'gray'); |
| }); |
| |
| it('should parse an <integer> node into a Number', function () { |
| var xml = multiline(function () {/* |
| <?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"> |
| <integer>14</integer> |
| </plist> |
| */}); |
| var parsed = parse(xml); |
| assert.strictEqual(parsed, 14); |
| }); |
| |
| it('should parse a <real> node into a Number', function () { |
| var xml = multiline(function () {/* |
| <?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"> |
| <real>3.14</real> |
| </plist> |
| */}); |
| var parsed = parse(xml); |
| assert.strictEqual(parsed, 3.14); |
| }); |
| |
| it('should parse a <date> node into a Date', function () { |
| var xml = multiline(function () {/* |
| <?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"> |
| <date>2010-02-08T21:41:23Z</date> |
| </plist> |
| */}); |
| var parsed = parse(xml); |
| assert(parsed instanceof Date); |
| assert.strictEqual(parsed.getTime(), 1265665283000); |
| }); |
| |
| it('should parse a <data> node into a Buffer', function () { |
| var xml = multiline(function () {/* |
| <?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"> |
| <data>4pyTIMOgIGxhIG1vZGU=</data> |
| </plist> |
| */}); |
| var parsed = parse(xml); |
| assert(Buffer.isBuffer(parsed)); |
| assert.strictEqual(parsed.toString('utf8'), '✓ à la mode'); |
| }); |
| |
| it('should parse a <data> node with newlines into a Buffer', function () { |
| var xml = multiline(function () {/* |
| <?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"> |
| <data>4pyTIMOgIGxhIG |
| |
| |
| 1v |
| |
| ZG |
| U=</data> |
| </plist> |
| */}); |
| var parsed = parse(xml); |
| assert(Buffer.isBuffer(parsed)); |
| assert.strictEqual(parsed.toString('utf8'), '✓ à la mode'); |
| }); |
| |
| it('should parse a <true> node into a Boolean `true` value', function () { |
| var xml = multiline(function () {/* |
| <?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"> |
| <true/> |
| </plist> |
| */}); |
| var parsed = parse(xml); |
| assert.strictEqual(parsed, true); |
| }); |
| |
| it('should parse a <false> node into a Boolean `false` value', function () { |
| var xml = multiline(function () {/* |
| <?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"> |
| <false/> |
| </plist> |
| */}); |
| var parsed = parse(xml); |
| assert.strictEqual(parsed, false); |
| }); |
| |
| it('should parse an <array> node into an Array', function () { |
| var xml = multiline(function () {/* |
| <?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"> |
| <array> |
| <dict> |
| <key>duration</key> |
| <real>5555.0495000000001</real> |
| <key>start</key> |
| <real>0.0</real> |
| </dict> |
| </array> |
| </plist> |
| */}); |
| var parsed = parse(xml); |
| assert.deepEqual(parsed, [ |
| { |
| duration: 5555.0495, |
| start: 0 |
| } |
| ]); |
| }); |
| |
| it('should parse a plist file with XML comments', function () { |
| var xml = multiline(function () {/* |
| <?xml version="1.0" encoding="UTF-8"?> |
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
| <plist version="1.0"> |
| <dict> |
| <key>CFBundleName</key> |
| <string>Emacs</string> |
| |
| <key>CFBundlePackageType</key> |
| <string>APPL</string> |
| |
| <!-- This should be the emacs version number. --> |
| |
| <key>CFBundleShortVersionString</key> |
| <string>24.3</string> |
| |
| <key>CFBundleSignature</key> |
| <string>EMAx</string> |
| |
| <!-- This SHOULD be a build number. --> |
| |
| <key>CFBundleVersion</key> |
| <string>9.0</string> |
| </dict> |
| </plist> |
| */}); |
| var parsed = parse(xml); |
| assert.deepEqual(parsed, { |
| CFBundleName: 'Emacs', |
| CFBundlePackageType: 'APPL', |
| CFBundleShortVersionString: '24.3', |
| CFBundleSignature: 'EMAx', |
| CFBundleVersion: '9.0' |
| }); |
| }); |
| |
| it('should parse a plist file with CDATA content', function () { |
| var xml = multiline(function () {/* |
| <?xml version="1.0" encoding="UTF-8"?> |
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
| <plist version="1.0"> |
| <dict> |
| <key>OptionsLabel</key> |
| <string>Product</string> |
| <key>PopupMenu</key> |
| <array> |
| <dict> |
| <key>Key</key> |
| <string>iPhone</string> |
| <key>Title</key> |
| <string>iPhone</string> |
| </dict> |
| <dict> |
| <key>Key</key> |
| <string>iPad</string> |
| <key>Title</key> |
| <string>iPad</string> |
| </dict> |
| <dict> |
| <key>Key</key> |
| <string> |
| <![CDATA[ |
| #import <Cocoa/Cocoa.h> |
| |
| #import <MacRuby/MacRuby.h> |
| |
| int main(int argc, char *argv[]) |
| { |
| return macruby_main("rb_main.rb", argc, argv); |
| } |
| ]]> |
| </string> |
| </dict> |
| </array> |
| <key>TemplateSelection</key> |
| <dict> |
| <key>iPhone</key> |
| <string>Tab Bar iPhone Application</string> |
| <key>iPad</key> |
| <string>Tab Bar iPad Application</string> |
| </dict> |
| </dict> |
| </plist> |
| */}); |
| var parsed = parse(xml); |
| assert.deepEqual(parsed, { OptionsLabel: 'Product', |
| PopupMenu: |
| [ { Key: 'iPhone', Title: 'iPhone' }, |
| { Key: 'iPad', Title: 'iPad' }, |
| { Key: '\n \n #import <Cocoa/Cocoa.h>\n\n#import <MacRuby/MacRuby.h>\n\nint main(int argc, char *argv[])\n{\n return macruby_main("rb_main.rb", argc, argv);\n}\n\n' } ], |
| TemplateSelection: |
| { iPhone: 'Tab Bar iPhone Application', |
| iPad: 'Tab Bar iPad Application' } |
| }); |
| }); |
| |
| it('should parse an example "Cordova.plist" file', function () { |
| var xml = multiline(function () {/* |
| <?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"> |
| <!-- |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| # |
| --> |
| <plist version="1.0"> |
| <dict> |
| <key>UIWebViewBounce</key> |
| <true/> |
| <key>TopActivityIndicator</key> |
| <string>gray</string> |
| <key>EnableLocation</key> |
| <false/> |
| <key>EnableViewportScale</key> |
| <false/> |
| <key>AutoHideSplashScreen</key> |
| <true/> |
| <key>ShowSplashScreenSpinner</key> |
| <true/> |
| <key>MediaPlaybackRequiresUserAction</key> |
| <false/> |
| <key>AllowInlineMediaPlayback</key> |
| <false/> |
| <key>OpenAllWhitelistURLsInWebView</key> |
| <false/> |
| <key>BackupWebStorage</key> |
| <true/> |
| <key>ExternalHosts</key> |
| <array> |
| <string>*</string> |
| </array> |
| <key>Plugins</key> |
| <dict> |
| <key>Device</key> |
| <string>CDVDevice</string> |
| <key>Logger</key> |
| <string>CDVLogger</string> |
| <key>Compass</key> |
| <string>CDVLocation</string> |
| <key>Accelerometer</key> |
| <string>CDVAccelerometer</string> |
| <key>Camera</key> |
| <string>CDVCamera</string> |
| <key>NetworkStatus</key> |
| <string>CDVConnection</string> |
| <key>Contacts</key> |
| <string>CDVContacts</string> |
| <key>Debug Console</key> |
| <string>CDVDebugConsole</string> |
| <key>Echo</key> |
| <string>CDVEcho</string> |
| <key>File</key> |
| <string>CDVFile</string> |
| <key>FileTransfer</key> |
| <string>CDVFileTransfer</string> |
| <key>Geolocation</key> |
| <string>CDVLocation</string> |
| <key>Notification</key> |
| <string>CDVNotification</string> |
| <key>Media</key> |
| <string>CDVSound</string> |
| <key>Capture</key> |
| <string>CDVCapture</string> |
| <key>SplashScreen</key> |
| <string>CDVSplashScreen</string> |
| <key>Battery</key> |
| <string>CDVBattery</string> |
| </dict> |
| </dict> |
| </plist> |
| */}); |
| var parsed = parse(xml); |
| assert.deepEqual(parsed, { |
| UIWebViewBounce: true, |
| TopActivityIndicator: 'gray', |
| EnableLocation: false, |
| EnableViewportScale: false, |
| AutoHideSplashScreen: true, |
| ShowSplashScreenSpinner: true, |
| MediaPlaybackRequiresUserAction: false, |
| AllowInlineMediaPlayback: false, |
| OpenAllWhitelistURLsInWebView: false, |
| BackupWebStorage: true, |
| ExternalHosts: [ '*' ], |
| Plugins: { |
| Device: 'CDVDevice', |
| Logger: 'CDVLogger', |
| Compass: 'CDVLocation', |
| Accelerometer: 'CDVAccelerometer', |
| Camera: 'CDVCamera', |
| NetworkStatus: 'CDVConnection', |
| Contacts: 'CDVContacts', |
| 'Debug Console': 'CDVDebugConsole', |
| Echo: 'CDVEcho', |
| File: 'CDVFile', |
| FileTransfer: 'CDVFileTransfer', |
| Geolocation: 'CDVLocation', |
| Notification: 'CDVNotification', |
| Media: 'CDVSound', |
| Capture: 'CDVCapture', |
| SplashScreen: 'CDVSplashScreen', |
| Battery: 'CDVBattery' |
| } |
| }); |
| }); |
| |
| it('should parse an example "Xcode-Info.plist" file', function () { |
| var xml = multiline(function () {/* |
| <?xml version="1.0" encoding="UTF-8"?> |
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
| <plist version="1.0"> |
| <dict> |
| <key>CFBundleDevelopmentRegion</key> |
| <string>en</string> |
| <key>CFBundleDisplayName</key> |
| <string>${PRODUCT_NAME}</string> |
| <key>CFBundleExecutable</key> |
| <string>${EXECUTABLE_NAME}</string> |
| <key>CFBundleIconFiles</key> |
| <array/> |
| <key>CFBundleIdentifier</key> |
| <string>com.joshfire.ads</string> |
| <key>CFBundleInfoDictionaryVersion</key> |
| <string>6.0</string> |
| <key>CFBundleName</key> |
| <string>${PRODUCT_NAME}</string> |
| <key>CFBundlePackageType</key> |
| <string>APPL</string> |
| <key>CFBundleShortVersionString</key> |
| <string>1.0</string> |
| <key>CFBundleSignature</key> |
| <string>????</string> |
| <key>CFBundleVersion</key> |
| <string>1.0</string> |
| <key>LSRequiresIPhoneOS</key> |
| <true/> |
| <key>UIRequiredDeviceCapabilities</key> |
| <array> |
| <string>armv7</string> |
| </array> |
| <key>UISupportedInterfaceOrientations</key> |
| <array> |
| <string>UIInterfaceOrientationPortrait</string> |
| <string>UIInterfaceOrientationLandscapeLeft</string> |
| <string>UIInterfaceOrientationLandscapeRight</string> |
| </array> |
| <key>UISupportedInterfaceOrientations~ipad</key> |
| <array> |
| <string>UIInterfaceOrientationPortrait</string> |
| <string>UIInterfaceOrientationPortraitUpsideDown</string> |
| <string>UIInterfaceOrientationLandscapeLeft</string> |
| <string>UIInterfaceOrientationLandscapeRight</string> |
| </array> |
| <key>CFBundleAllowMixedLocalizations</key> |
| <true/> |
| </dict> |
| </plist> |
| */}); |
| var parsed = parse(xml); |
| assert.deepEqual(parsed, { |
| CFBundleDevelopmentRegion: 'en', |
| CFBundleDisplayName: '${PRODUCT_NAME}', |
| CFBundleExecutable: '${EXECUTABLE_NAME}', |
| CFBundleIconFiles: [], |
| CFBundleIdentifier: 'com.joshfire.ads', |
| CFBundleInfoDictionaryVersion: '6.0', |
| CFBundleName: '${PRODUCT_NAME}', |
| CFBundlePackageType: 'APPL', |
| CFBundleShortVersionString: '1.0', |
| CFBundleSignature: '????', |
| CFBundleVersion: '1.0', |
| LSRequiresIPhoneOS: true, |
| UIRequiredDeviceCapabilities: [ 'armv7' ], |
| UISupportedInterfaceOrientations: |
| [ 'UIInterfaceOrientationPortrait', |
| 'UIInterfaceOrientationLandscapeLeft', |
| 'UIInterfaceOrientationLandscapeRight' ], |
| 'UISupportedInterfaceOrientations~ipad': |
| [ 'UIInterfaceOrientationPortrait', |
| 'UIInterfaceOrientationPortraitUpsideDown', |
| 'UIInterfaceOrientationLandscapeLeft', |
| 'UIInterfaceOrientationLandscapeRight' ], |
| CFBundleAllowMixedLocalizations: true |
| }); |
| }); |
| |
| }); |
| |
| }); |