You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ks...@apache.org on 2016/11/21 20:42:55 UTC

[1/2] ios commit: CB-12155: Create tests for launch storyboards

Repository: cordova-ios
Updated Branches:
  refs/heads/master b8ae88d82 -> 4b8646245


http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/prepare.spec.js
----------------------------------------------------------------------
diff --git a/tests/spec/unit/prepare.spec.js b/tests/spec/unit/prepare.spec.js
index 00624b0..bf0d303 100644
--- a/tests/spec/unit/prepare.spec.js
+++ b/tests/spec/unit/prepare.spec.js
@@ -56,7 +56,7 @@ function wrapperError(p, done, post) {
     }).fin(done);
 }
 
-describe('prepare', function () {
+describe('prepare', function() {
     var p;
     beforeEach(function() {
         shell.mkdir('-p', iosPlatform);
@@ -68,6 +68,486 @@ describe('prepare', function () {
         shell.rm('-rf', path.join(__dirname, 'some'));
     });
 
+    describe('launch storyboard feature (CB-9762)', function() {
+        function makeSplashScreenEntry(src, width, height) {
+            return {
+                src: src,
+                width: width,
+                height: height
+            };
+        }
+
+        var noLaunchStoryboardImages = [];
+
+        var singleLaunchStoryboardImage = [makeSplashScreenEntry('res/splash/ios/Default@2x~universal~anyany.png')];
+
+        var singleLaunchStoryboardImageWithLegacyLaunchImage = [
+            makeSplashScreenEntry('res/splash/ios/Default@2x~universal~anyany.png'),
+            makeSplashScreenEntry('res/splash/ios/another-image.png', 1024, 768)
+        ];
+
+        var typicalLaunchStoryboardImages = [
+            makeSplashScreenEntry('res/splash/ios/Default@2x~universal~anyany.png'),
+            makeSplashScreenEntry('res/splash/ios/Default@2x~universal~comany.png'),
+            makeSplashScreenEntry('res/splash/ios/Default@2x~universal~comcom.png'),
+            makeSplashScreenEntry('res/splash/ios/Default@3x~universal~anyany.png'),
+            makeSplashScreenEntry('res/splash/ios/Default@3x~universal~anycom.png'),
+            makeSplashScreenEntry('res/splash/ios/Default@3x~universal~comany.png')
+        ];
+
+        var multiDeviceLaunchStoryboardImages = [
+            makeSplashScreenEntry('res/splash/ios/Default@2x~ipad~anyany.png'),
+            makeSplashScreenEntry('res/splash/ios/Default@2x~ipad~comany.png'),
+            makeSplashScreenEntry('res/splash/ios/Default@2x~ipad~comcom.png'),
+            makeSplashScreenEntry('res/splash/ios/Default@2x~universal~anyany.png'),
+            makeSplashScreenEntry('res/splash/ios/Default@2x~universal~comany.png'),
+            makeSplashScreenEntry('res/splash/ios/Default@2x~universal~comcom.png'),
+            makeSplashScreenEntry('res/splash/ios/Default@3x~iphone~anyany.png'),
+            makeSplashScreenEntry('res/splash/ios/Default@3x~iphone~anycom.png'),
+            makeSplashScreenEntry('res/splash/ios/Default@3x~iphone~comany.png')
+        ];
+
+        describe('#mapLaunchStoryboardContents', function() {
+            var mapLaunchStoryboardContents = prepare.__get__('mapLaunchStoryboardContents');
+
+            it('should return an array with no mapped storyboard images', function() {
+                var result = mapLaunchStoryboardContents(noLaunchStoryboardImages, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual(require('./fixtures/launch-storyboard-support/contents-map/empty-map'));
+            });
+
+            it('should return an array with one mapped storyboard image', function() {
+                var result = mapLaunchStoryboardContents(singleLaunchStoryboardImage, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual(require('./fixtures/launch-storyboard-support/contents-map/single-2xanyany-map'));
+            });
+
+            it('should return an array with one mapped storyboard image, even with legacy images', function() {
+                var result = mapLaunchStoryboardContents(singleLaunchStoryboardImageWithLegacyLaunchImage, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual(require('./fixtures/launch-storyboard-support/contents-map/single-2xanyany-map'));
+            });
+
+            it('should return an array with several mapped storyboard images', function() {
+                var result = mapLaunchStoryboardContents(typicalLaunchStoryboardImages, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual(require('./fixtures/launch-storyboard-support/contents-map/typical-universal-map'));
+            });
+
+            it('should return an array with several mapped storyboard images across device classes', function() {
+                var result = mapLaunchStoryboardContents(multiDeviceLaunchStoryboardImages, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual(require('./fixtures/launch-storyboard-support/contents-map/varied-device-map'));
+            });
+        });
+
+        describe('#mapLaunchStoryboardResources', function() {
+            var mapLaunchStoryboardResources = prepare.__get__('mapLaunchStoryboardResources');
+
+            it('should return an empty object with no mapped storyboard images', function () {
+                var result = mapLaunchStoryboardResources(noLaunchStoryboardImages, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual({});
+            });
+
+            it('should return an object with one mapped storyboard image', function() {
+                var result = mapLaunchStoryboardResources(singleLaunchStoryboardImage, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual({
+                    'Default@2x~universal~anyany.png' : 'res/splash/ios/Default@2x~universal~anyany.png'
+                });
+            });
+
+            it('should return an object with one mapped storyboard image, even with legacy images', function() {
+                var result = mapLaunchStoryboardResources(singleLaunchStoryboardImageWithLegacyLaunchImage, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual({
+                    'Default@2x~universal~anyany.png' : 'res/splash/ios/Default@2x~universal~anyany.png'
+                });
+            });
+
+            it('should return an object with several mapped storyboard images', function() {
+                var result = mapLaunchStoryboardResources(typicalLaunchStoryboardImages, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual({
+                    'Default@2x~universal~anyany.png' : 'res/splash/ios/Default@2x~universal~anyany.png',
+                    'Default@2x~universal~comany.png' : 'res/splash/ios/Default@2x~universal~comany.png',
+                    'Default@2x~universal~comcom.png' : 'res/splash/ios/Default@2x~universal~comcom.png',
+                    'Default@3x~universal~anyany.png' : 'res/splash/ios/Default@3x~universal~anyany.png',
+                    'Default@3x~universal~anycom.png' : 'res/splash/ios/Default@3x~universal~anycom.png',
+                    'Default@3x~universal~comany.png' : 'res/splash/ios/Default@3x~universal~comany.png'
+                });
+            });
+
+            it('should return an object with several mapped storyboard images across device classes', function() {
+                var result = mapLaunchStoryboardResources(multiDeviceLaunchStoryboardImages, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual({
+                    'Default@2x~universal~anyany.png' : 'res/splash/ios/Default@2x~universal~anyany.png',
+                    'Default@2x~universal~comany.png' : 'res/splash/ios/Default@2x~universal~comany.png',
+                    'Default@2x~universal~comcom.png' : 'res/splash/ios/Default@2x~universal~comcom.png',
+                    'Default@2x~ipad~anyany.png' : 'res/splash/ios/Default@2x~ipad~anyany.png',
+                    'Default@2x~ipad~comany.png' : 'res/splash/ios/Default@2x~ipad~comany.png',
+                    'Default@2x~ipad~comcom.png' : 'res/splash/ios/Default@2x~ipad~comcom.png',
+                    'Default@3x~iphone~anyany.png' : 'res/splash/ios/Default@3x~iphone~anyany.png',
+                    'Default@3x~iphone~anycom.png' : 'res/splash/ios/Default@3x~iphone~anycom.png',
+                    'Default@3x~iphone~comany.png' : 'res/splash/ios/Default@3x~iphone~comany.png'
+                });
+            });
+        });
+
+        describe('#getLaunchStoryboardContentsJSON', function() {
+            var getLaunchStoryboardContentsJSON = prepare.__get__('getLaunchStoryboardContentsJSON');
+
+            it('should return contents.json with no mapped storyboard images', function () {
+                var result = getLaunchStoryboardContentsJSON(noLaunchStoryboardImages, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual(require('./fixtures/launch-storyboard-support/contents-json/empty'));
+            });
+
+            it('should return contents.json with one mapped storyboard image', function() {
+                var result = getLaunchStoryboardContentsJSON(singleLaunchStoryboardImage, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual(require('./fixtures/launch-storyboard-support/contents-json/single-2xanyany'));
+            });
+
+            it('should return contents.json with one mapped storyboard image, even with legacy images', function() {
+                var result = getLaunchStoryboardContentsJSON(singleLaunchStoryboardImageWithLegacyLaunchImage, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual(require('./fixtures/launch-storyboard-support/contents-json/single-2xanyany'));
+            });
+
+            it('should return contents.json with several mapped storyboard images', function() {
+                var result = getLaunchStoryboardContentsJSON(typicalLaunchStoryboardImages, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual(require('./fixtures/launch-storyboard-support/contents-json/typical-universal'));
+            });
+
+            it('should return contents.json with several mapped storyboard images across device classes', function() {
+                var result = getLaunchStoryboardContentsJSON(multiDeviceLaunchStoryboardImages, '');
+                expect(result).toBeDefined();
+                expect(result).toEqual(require('./fixtures/launch-storyboard-support/contents-json/varied-device'));
+            });
+        });
+
+        describe('#getLaunchStoryboardImagesDir', function() {
+            var getLaunchStoryboardImagesDir = prepare.__get__('getLaunchStoryboardImagesDir');
+            var projectRoot = iosProject;
+
+            it('should find the Images.xcassets file in a project with an asset catalog', function() {
+                var platformProjDir = path.join('platforms', 'ios', 'SampleApp');
+                var assetCatalogPath = path.join(iosProject, platformProjDir, 'Images.xcassets');
+                var expectedPath = path.join(platformProjDir, 'Images.xcassets', 'LaunchStoryboard.imageset/');
+
+                var fileExists = shell.test('-e', assetCatalogPath);
+                expect(fileExists).toEqual(true);
+
+                var returnPath = getLaunchStoryboardImagesDir(projectRoot, platformProjDir);
+                expect(returnPath).toEqual(expectedPath);
+            });
+
+            it('should NOT find the Images.xcassets file in a project with no asset catalog', function() {
+                var platformProjDir = path.join('platforms', 'ios', 'SamplerApp');
+                var assetCatalogPath = path.join(iosProject, platformProjDir, 'Images.xcassets');
+
+                var fileExists = shell.test('-e', assetCatalogPath);
+                expect(fileExists).toEqual(false);
+
+                var returnPath = getLaunchStoryboardImagesDir(projectRoot, platformProjDir);
+                expect(returnPath).toBeNull();
+            });
+        });
+
+        describe ('#platformHasLaunchStoryboardImages', function() {
+            var platformHasLaunchStoryboardImages = prepare.__get__('platformHasLaunchStoryboardImages');
+            var cfgs = ['none', 'legacy-only', 'modern-only', 'modern-and-legacy'].reduce(function (p,c) {
+                p[c] = new ConfigParser(path.join(FIXTURES, 'launch-storyboard-support', 'configs', c + '.xml'));
+                return p;
+            }, {});
+
+            it('should be false with no launch images', function() {
+                expect(platformHasLaunchStoryboardImages(cfgs.none)).toEqual(false);
+            });
+            it('should be false with only legacy images', function() {
+                expect(platformHasLaunchStoryboardImages(cfgs['legacy-only'])).toEqual(false);
+            });
+            it('should be true with typical launch storyboard images', function() {
+                expect(platformHasLaunchStoryboardImages(cfgs['modern-only'])).toEqual(true);
+            });
+            it('should be true with typical and legacy launch storyboard images', function() {
+                expect(platformHasLaunchStoryboardImages(cfgs['modern-and-legacy'])).toEqual(true);
+            });
+        });
+
+        describe ('#platformHasLegacyLaunchImages', function() {
+            var platformHasLegacyLaunchImages = prepare.__get__('platformHasLegacyLaunchImages');
+            var cfgs = ['none', 'legacy-only', 'modern-only', 'modern-and-legacy'].reduce(function (p,c) {
+                p[c] = new ConfigParser(path.join(FIXTURES, 'launch-storyboard-support', 'configs', c + '.xml'));
+                return p;
+            }, {});
+
+            it('should be false with no launch images', function() {
+                expect(platformHasLegacyLaunchImages(cfgs.none)).toEqual(false);
+            });
+            it('should be true with only legacy images', function() {
+                expect(platformHasLegacyLaunchImages(cfgs['legacy-only'])).toEqual(true);
+            });
+            it('should be false with typical launch storyboard images', function() {
+                expect(platformHasLegacyLaunchImages(cfgs['modern-only'])).toEqual(false);
+            });
+            it('should be true with typical and legacy launch storyboard images', function() {
+                expect(platformHasLegacyLaunchImages(cfgs['modern-and-legacy'])).toEqual(true);
+            });
+
+        });
+
+        describe('#updateProjectPlistForLaunchStoryboard', function() {
+            var updateProjectPlistForLaunchStoryboard = prepare.__get__('updateProjectPlistForLaunchStoryboard');
+            var plistFile = path.join(iosPlatform, 'SampleApp', 'SampleApp-Info.plist');
+            var cfgs;
+            it('setup', function () {
+                cfgs = ['none', 'legacy-only', 'modern-only', 'modern-and-legacy'].reduce(function (p,c) {
+                    p[c] = {
+                        config: new ConfigParser(path.join(FIXTURES, 'launch-storyboard-support', 'configs', c + '.xml')),
+                        plist: plist.parse(fs.readFileSync(plistFile, 'utf8'))
+                    };
+                    return p;
+                }, {});
+            });
+
+            it('should not change the info plist when no launch images are supplied', function() {
+                var plist = cfgs.none.plist;
+                updateProjectPlistForLaunchStoryboard(cfgs.none.config, plist);
+                expect(plist.UILaunchStoryboardName).toBeUndefined();
+            });
+            it('should not change the info plist when only legacy launch images are supplied', function() {
+                var plist = cfgs['legacy-only'].plist;
+                updateProjectPlistForLaunchStoryboard(cfgs['legacy-only'].config, plist);
+                expect(plist.UILaunchStoryboardName).toBeUndefined();
+            });
+            it('should change the info plist when only modern launch images are supplied', function() {
+                var plist = cfgs['modern-only'].plist;
+                updateProjectPlistForLaunchStoryboard(cfgs['modern-only'].config, plist);
+                expect(plist.UILaunchStoryboardName).toEqual('CDVLaunchScreen');
+            });
+            it('should change the info plist when both legacy and modern launch images are supplied', function() {
+                var plist = cfgs['modern-and-legacy'].plist;
+                updateProjectPlistForLaunchStoryboard(cfgs['modern-and-legacy'].config, plist);
+                expect(plist.UILaunchStoryboardName).toEqual('CDVLaunchScreen');
+            });
+            it('should remove the setting when no launch images are supplied but storyboard setting configured', function() {
+                var plist = cfgs.none.plist;
+                plist.UILaunchStoryboardName = 'CDVLaunchScreen';
+                updateProjectPlistForLaunchStoryboard(cfgs.none.config, plist);
+                expect(plist.UILaunchStoryboardName).toBeUndefined();
+            });
+            it('should remove the setting when only legacy images are supplied but storyboard setting configured', function() {
+                var plist = cfgs['legacy-only'].plist;
+                plist.UILaunchStoryboardName = 'CDVLaunchScreen';
+                updateProjectPlistForLaunchStoryboard(cfgs['legacy-only'].config, plist);
+                expect(plist.UILaunchStoryboardName).toBeUndefined();
+            });
+            it('should maintain the launch storyboard setting over multiple calls when modern images supplied', function() {
+                var plist = cfgs['modern-only'].plist;
+                delete plist.UILaunchStoryboardName;
+                updateProjectPlistForLaunchStoryboard(cfgs['modern-and-legacy'].config, plist);
+                expect(plist.UILaunchStoryboardName).toEqual('CDVLaunchScreen');
+                updateProjectPlistForLaunchStoryboard(cfgs['modern-and-legacy'].config, plist);
+                expect(plist.UILaunchStoryboardName).toEqual('CDVLaunchScreen');
+            });
+            it('should not attempt to override launch storyboard setting if not set to our storyboard', function() {
+                var plist = cfgs['modern-and-legacy'].plist;
+                plist.UILaunchStoryboardName = 'AnotherStoryboard';
+                updateProjectPlistForLaunchStoryboard(cfgs['modern-and-legacy'].config, plist);
+                expect(plist.UILaunchStoryboardName).toEqual('AnotherStoryboard');
+            });
+
+        });
+
+        describe ('#updateLaunchStoryboardImages', function() {
+            var getLaunchStoryboardImagesDir = prepare.__get__('getLaunchStoryboardImagesDir');
+            var updateLaunchStoryboardImages = prepare.__get__('updateLaunchStoryboardImages');
+            var logFileOp = prepare.__get__('logFileOp');
+
+            it('should clean storyboard launch images and update contents.json', function() {
+                // spy!
+                var updatePaths = spyOn(FileUpdater, 'updatePaths');
+
+                // get appropriate paths
+                var projectRoot = iosProject;
+                var platformProjDir = path.join('platforms', 'ios', 'SampleApp');
+                var storyboardImagesDir = getLaunchStoryboardImagesDir(projectRoot, platformProjDir);
+
+                // create a suitable mock project for our method
+                var project = {
+                    root: iosProject,
+                    locations: p.locations,
+                    projectConfig: new ConfigParser(path.join(FIXTURES, 'launch-storyboard-support', 'configs', 'modern-only.xml'))
+                };
+
+                // copy the splash screen fixtures to the iOS project
+                shell.cp('-rf', path.join(FIXTURES, 'launch-storyboard-support', 'res'), iosProject);
+
+                // copy splash screens and update Contents.json
+                updateLaunchStoryboardImages(project, p.locations);
+
+                // verify that updatePaths was called as we expect
+                var expectedResourceMap = {
+                    'Default@2x~universal~comcom.png' : 'res/screen/ios/Default@2x~universal~comcom.png',
+                    'Default@2x~universal~comany.png' : 'res/screen/ios/Default@2x~universal~comany.png',
+                    'Default@2x~universal~anyany.png' : 'res/screen/ios/Default@2x~universal~anyany.png',
+                    'Default@3x~universal~comany.png' : 'res/screen/ios/Default@3x~universal~comany.png',
+                    'Default@3x~universal~anycom.png' : 'res/screen/ios/Default@3x~universal~anycom.png',
+                    'Default@3x~universal~anyany.png' : 'res/screen/ios/Default@3x~universal~anyany.png' };
+                // update keys with path to storyboardImagesDir
+                for (var k in expectedResourceMap) {
+                    if (expectedResourceMap.hasOwnProperty(k)) {
+                        expectedResourceMap[storyboardImagesDir + k] = expectedResourceMap[k];
+                        delete expectedResourceMap[k];
+                    }
+                }
+                expect(updatePaths).toHaveBeenCalledWith( expectedResourceMap, {
+                        rootDir: project.root
+                    }, logFileOp
+                );
+
+                // verify that that Contents.json is as we expect
+                var result = JSON.parse(fs.readFileSync(path.join(project.root, storyboardImagesDir, 'Contents.json')));
+                expect(result).toEqual(require('./fixtures/launch-storyboard-support/contents-json/typical-universal')); 
+            });
+        });
+
+        describe ('#cleanLaunchStoryboardImages', function() {
+            var getLaunchStoryboardImagesDir = prepare.__get__('getLaunchStoryboardImagesDir');
+            var updateLaunchStoryboardImages = prepare.__get__('updateLaunchStoryboardImages');
+            var cleanLaunchStoryboardImages = prepare.__get__('cleanLaunchStoryboardImages');
+            var logFileOp = prepare.__get__('logFileOp');
+
+            it('should move launch images and update contents.json', function() {
+
+                var projectRoot = iosProject;
+                var platformProjDir = path.join('platforms', 'ios', 'SampleApp');
+                var storyboardImagesDir = getLaunchStoryboardImagesDir(projectRoot, platformProjDir);
+                var project = {
+                    root: iosProject,
+                    locations: p.locations,
+                    projectConfig: new ConfigParser(path.join(FIXTURES, 'launch-storyboard-support', 'configs', 'modern-only.xml'))
+                };
+
+                shell.cp('-rf', path.join(FIXTURES, 'launch-storyboard-support', 'res'), iosProject);
+                updateLaunchStoryboardImages(project, p.locations);
+
+                // now, clean the images
+                var updatePaths = spyOn(FileUpdater, 'updatePaths');
+                cleanLaunchStoryboardImages(projectRoot, project.projectConfig, p.locations);
+
+                // verify that updatePaths was called as we expect
+                var expectedResourceMap = {
+                    'Default@2x~universal~comcom.png' : null,
+                    'Default@2x~universal~comany.png' : null,
+                    'Default@2x~universal~anyany.png' : null, 
+                    'Default@3x~universal~comany.png' : null,
+                    'Default@3x~universal~anycom.png' : null,
+                    'Default@3x~universal~anyany.png' : null };
+                // update keys with path to storyboardImagesDir
+                for (var k in expectedResourceMap) {
+                    if (expectedResourceMap.hasOwnProperty(k)) {
+                        expectedResourceMap[storyboardImagesDir + k] = null;
+                        delete expectedResourceMap[k];
+                    }
+                }
+                expect(updatePaths).toHaveBeenCalledWith( expectedResourceMap, {
+                        rootDir: project.root,
+                        all: true
+                    }, logFileOp
+                );
+
+                // verify that that Contents.json is as we expect
+                var result = JSON.parse(fs.readFileSync(path.join(project.root, storyboardImagesDir, 'Contents.json')));
+                expect(result).toEqual(require('./fixtures/launch-storyboard-support/contents-json/empty')); 
+            });
+        });
+
+        describe ('#checkIfBuildSettingsNeedUpdatedForLaunchStoryboard', function() {
+            var checkIfBuildSettingsNeedUpdatedForLaunchStoryboard = prepare.__get__('checkIfBuildSettingsNeedUpdatedForLaunchStoryboard');
+            var updateProjectPlistForLaunchStoryboard = prepare.__get__('updateProjectPlistForLaunchStoryboard');
+            var plistFile = path.join(iosPlatform, 'SampleApp', 'SampleApp-Info.plist');
+            var cfgs; 
+            it ('setup', function() {
+                cfgs = ['none', 'legacy-only', 'modern-only', 'modern-and-legacy'].reduce(function (p,c) {
+                    p[c] = {
+                        config: new ConfigParser(path.join(FIXTURES, 'launch-storyboard-support', 'configs', c + '.xml')),
+                        plist: plist.parse(fs.readFileSync(plistFile, 'utf8'))
+                    };
+                    return p;
+                }, {});
+            });
+
+            it('should return false with no launch images', function () {
+                var cfg = cfgs.none;
+                updateProjectPlistForLaunchStoryboard(cfg.config, cfg.plist);
+                expect(checkIfBuildSettingsNeedUpdatedForLaunchStoryboard(cfg.config, cfg.plist)).toEqual(false);
+            });
+            it('should return true with only legacy images', function () {
+                // why? because legacy images require Xcode to compile launch image assets
+                // and we may have previously removed that setting
+                var cfg = cfgs['legacy-only'];
+                updateProjectPlistForLaunchStoryboard(cfg.config, cfg.plist);
+                expect(checkIfBuildSettingsNeedUpdatedForLaunchStoryboard(cfg.config, cfg.plist)).toEqual(true);
+            });
+            it('should return true with only storyboard images', function () {
+                var cfg = cfgs['modern-only'];
+                updateProjectPlistForLaunchStoryboard(cfg.config, cfg.plist);
+                expect(checkIfBuildSettingsNeedUpdatedForLaunchStoryboard(cfg.config, cfg.plist)).toEqual(true);
+            });
+            it('should return false with storyboard and legacy images', function () {
+                // why? because we assume that the build settings will still build the asset catalog
+                // the user has specified both legacy and modern images, so why question it?
+                var cfg = cfgs['modern-and-legacy'];
+                updateProjectPlistForLaunchStoryboard(cfg.config, cfg.plist);
+                expect(checkIfBuildSettingsNeedUpdatedForLaunchStoryboard(cfg.config, cfg.plist)).toEqual(false);
+            });
+
+        });
+
+        describe ('#updateBuildSettingsForLaunchStoryboard', function() {
+            var updateBuildSettingsForLaunchStoryboard = prepare.__get__('updateBuildSettingsForLaunchStoryboard');
+            var updateProjectPlistForLaunchStoryboard = prepare.__get__('updateProjectPlistForLaunchStoryboard');
+            var plistFile = path.join(iosPlatform, 'SampleApp', 'SampleApp-Info.plist');
+            var cfgs;
+            it('setup', function () {
+                cfgs = ['legacy-only', 'modern-only'].reduce(function (p,c) {
+                    p[c] = {
+                        config: new ConfigParser(path.join(FIXTURES, 'launch-storyboard-support', 'configs', c + '.xml')),
+                        plist: plist.parse(fs.readFileSync(plistFile, 'utf8'))
+                    };
+                    return p;
+                }, {});
+            });
+
+            it('should update build property with only legacy images', function () {
+                var cfg = cfgs['legacy-only'];
+                var proj = new xcode.project(p.locations.pbxproj);
+                proj.parseSync();
+                updateProjectPlistForLaunchStoryboard(cfg.config, cfg.plist);
+                updateBuildSettingsForLaunchStoryboard(proj, cfg.config, cfg.plist);
+                expect(proj.getBuildProperty('ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME')).toEqual('LaunchImage');
+            });
+            it('should remove build property with only storyboard images', function () {
+                var cfg = cfgs['modern-only'];
+                var proj = new xcode.project(p.locations.pbxproj);
+                proj.parseSync();
+                // set a value for our asset catalog to make sure it really goes away
+                proj.updateBuildProperty('ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME','LaunchImage');
+                updateProjectPlistForLaunchStoryboard(cfg.config, cfg.plist);
+                updateBuildSettingsForLaunchStoryboard(proj, cfg.config, cfg.plist);
+                expect(proj.getBuildProperty('ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME')).toBeUndefined();
+            });
+        });
+
+
+    });
+
     describe('updateProject method', function() {
         var mv;
         var update_name;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org


[2/2] ios commit: CB-12155: Create tests for launch storyboards

Posted by ks...@apache.org.
CB-12155: Create tests for launch storyboards

 This closes #280


Project: http://git-wip-us.apache.org/repos/asf/cordova-ios/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-ios/commit/4b864624
Tree: http://git-wip-us.apache.org/repos/asf/cordova-ios/tree/4b864624
Diff: http://git-wip-us.apache.org/repos/asf/cordova-ios/diff/4b864624

Branch: refs/heads/master
Commit: 4b86462452ffe69b33a54561e0d12583057592a8
Parents: b8ae88d
Author: Kerri Shotts <ks...@apache.org>
Authored: Fri Nov 18 15:43:40 2016 -0600
Committer: Kerri Shotts <ks...@apache.org>
Committed: Mon Nov 21 14:41:35 2016 -0600

----------------------------------------------------------------------
 .../AppIcon.appiconset/Contents.json            | 182 +++++++
 .../AppIcon.appiconset/icon-40.png              | Bin 0 -> 4082 bytes
 .../AppIcon.appiconset/icon-40@2x.png           | Bin 0 -> 7411 bytes
 .../AppIcon.appiconset/icon-50.png              | Bin 0 -> 4874 bytes
 .../AppIcon.appiconset/icon-50@2x.png           | Bin 0 -> 9611 bytes
 .../AppIcon.appiconset/icon-60@2x.png           | Bin 0 -> 11924 bytes
 .../AppIcon.appiconset/icon-60@3x.png           | Bin 0 -> 30083 bytes
 .../AppIcon.appiconset/icon-72.png              | Bin 0 -> 4944 bytes
 .../AppIcon.appiconset/icon-72@2x.png           | Bin 0 -> 11706 bytes
 .../AppIcon.appiconset/icon-76.png              | Bin 0 -> 7025 bytes
 .../AppIcon.appiconset/icon-76@2x.png           | Bin 0 -> 15262 bytes
 .../AppIcon.appiconset/icon-83.5@2x.png         | Bin 0 -> 20563 bytes
 .../AppIcon.appiconset/icon-small.png           | Bin 0 -> 3294 bytes
 .../AppIcon.appiconset/icon-small@2x.png        | Bin 0 -> 5608 bytes
 .../AppIcon.appiconset/icon-small@3x.png        | Bin 0 -> 7040 bytes
 .../Images.xcassets/AppIcon.appiconset/icon.png | Bin 0 -> 3902 bytes
 .../AppIcon.appiconset/icon@2x.png              | Bin 0 -> 7869 bytes
 .../SampleApp/Images.xcassets/Contents.json     |   6 +
 .../LaunchImage.launchimage/Contents.json       | 156 ++++++
 .../Default-568h@2x~iphone.png                  | Bin 0 -> 34225 bytes
 .../LaunchImage.launchimage/Default-667h.png    | Bin 0 -> 57532 bytes
 .../LaunchImage.launchimage/Default-736h.png    | Bin 0 -> 80929 bytes
 .../Default-Landscape-736h.png                  | Bin 0 -> 79491 bytes
 .../Default-Landscape@2x~ipad.png               | Bin 0 -> 212234 bytes
 .../Default-Landscape~ipad.png                  | Bin 0 -> 91810 bytes
 .../Default-Portrait@2x~ipad.png                | Bin 0 -> 212860 bytes
 .../Default-Portrait~ipad.png                   | Bin 0 -> 91713 bytes
 .../Default@2x~iphone.png                       | Bin 0 -> 29475 bytes
 .../LaunchImage.launchimage/Default~iphone.png  | Bin 0 -> 10394 bytes
 .../LaunchStoryboard.imageset/Contents.json     | 168 +++++++
 .../configs/legacy-only.xml                     |  35 ++
 .../configs/modern-and-legacy.xml               |  42 ++
 .../configs/modern-only.xml                     |  32 ++
 .../launch-storyboard-support/configs/none.xml  |  24 +
 .../contents-json/empty.js                      | 135 ++++++
 .../contents-json/single-2xanyany.js            | 136 ++++++
 .../contents-json/typical-universal.js          | 141 ++++++
 .../contents-json/varied-device.js              | 144 ++++++
 .../contents-map/empty-map.js                   | 194 ++++++++
 .../contents-map/single-2xanyany-map.js         | 197 ++++++++
 .../contents-map/typical-universal-map.js       | 212 ++++++++
 .../contents-map/varied-device-map.js           | 221 +++++++++
 .../screen/ios/Default@2x~universal~anyany.png  | Bin 0 -> 97812 bytes
 .../screen/ios/Default@2x~universal~comany.png  | Bin 0 -> 67990 bytes
 .../screen/ios/Default@2x~universal~comcom.png  | Bin 0 -> 55854 bytes
 .../screen/ios/Default@3x~universal~anyany.png  | Bin 0 -> 85826 bytes
 .../screen/ios/Default@3x~universal~anycom.png  | Bin 0 -> 75337 bytes
 .../screen/ios/Default@3x~universal~comany.png  | Bin 0 -> 74537 bytes
 tests/spec/unit/prepare.spec.js                 | 482 ++++++++++++++++++-
 49 files changed, 2506 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/Contents.json
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/Contents.json b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..d19e65f
--- /dev/null
+++ b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,182 @@
+{
+  "images" : [
+    {
+      "idiom" : "iphone",
+      "size" : "29x29",
+      "filename" : "icon-small.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "29x29",
+      "filename" : "icon-small@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "29x29",
+      "filename" : "icon-small@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "40x40",
+      "filename" : "icon-40@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "40x40",
+      "filename" : "icon-60@2x.png",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "57x57",
+      "filename" : "icon.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "57x57",
+      "filename" : "icon@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "60x60",
+      "filename" : "icon-60@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "60x60",
+      "filename" : "icon-60@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "29x29",
+      "filename" : "icon-small.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "29x29",
+      "filename" : "icon-small@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "40x40",
+      "filename" : "icon-40.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "40x40",
+      "filename" : "icon-40@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "50x50",
+      "filename" : "icon-50.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "50x50",
+      "filename" : "icon-50@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "72x72",
+      "filename" : "icon-72.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "72x72",
+      "filename" : "icon-72@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "76x76",
+      "filename" : "icon-76.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "76x76",
+      "filename" : "icon-76@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "83.5x83.5",
+      "filename" : "icon-83.5@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "24x24",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "notificationCenter",
+      "subtype" : "38mm"
+    },
+    {
+      "size" : "27.5x27.5",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "notificationCenter",
+      "subtype" : "42mm"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "watch",
+      "role" : "companionSettings",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "watch",
+      "role" : "companionSettings",
+      "scale" : "3x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "appLauncher",
+      "subtype" : "38mm"
+    },
+    {
+      "size" : "44x44",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "longLook",
+      "subtype" : "42mm"
+    },
+    {
+      "size" : "86x86",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "quickLook",
+      "subtype" : "38mm"
+    },
+    {
+      "size" : "98x98",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "quickLook",
+      "subtype" : "42mm"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-40.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-40.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-40.png
new file mode 100644
index 0000000..e865adb
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-40.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-40@2x.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-40@2x.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-40@2x.png
new file mode 100644
index 0000000..6d07dce
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-40@2x.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-50.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-50.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-50.png
new file mode 100644
index 0000000..98a9d96
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-50.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-50@2x.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-50@2x.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-50@2x.png
new file mode 100644
index 0000000..bac693f
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-50@2x.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-60@2x.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-60@2x.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-60@2x.png
new file mode 100644
index 0000000..955af36
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-60@2x.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-60@3x.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-60@3x.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-60@3x.png
new file mode 100644
index 0000000..e126891
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-60@3x.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-72.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-72.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-72.png
new file mode 100644
index 0000000..8c6e5df
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-72.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-72@2x.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-72@2x.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-72@2x.png
new file mode 100644
index 0000000..dd819da
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-72@2x.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-76.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-76.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-76.png
new file mode 100644
index 0000000..63afe7f
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-76.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-76@2x.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-76@2x.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-76@2x.png
new file mode 100644
index 0000000..4cff29a
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-76@2x.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-83.5@2x.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-83.5@2x.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-83.5@2x.png
new file mode 100644
index 0000000..3c1a011
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-83.5@2x.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-small.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-small.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-small.png
new file mode 100644
index 0000000..0ea1c42
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-small.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-small@2x.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-small@2x.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-small@2x.png
new file mode 100644
index 0000000..2c72038
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-small@2x.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-small@3x.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-small@3x.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-small@3x.png
new file mode 100644
index 0000000..5c37dfc
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon-small@3x.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon.png
new file mode 100644
index 0000000..b2571a7
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon@2x.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon@2x.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon@2x.png
new file mode 100644
index 0000000..d75098f
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/AppIcon.appiconset/icon@2x.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/Contents.json
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/Contents.json b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/Contents.json
new file mode 100644
index 0000000..da4a164
--- /dev/null
+++ b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Contents.json
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Contents.json b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Contents.json
new file mode 100644
index 0000000..175f378
--- /dev/null
+++ b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Contents.json
@@ -0,0 +1,156 @@
+{
+  "images" : [
+    {
+      "extent" : "full-screen",
+      "idiom" : "iphone",
+      "subtype" : "736h",
+      "filename" : "Default-736h.png",
+      "minimum-system-version" : "8.0",
+      "orientation" : "portrait",
+      "scale" : "3x"
+    },
+    {
+      "extent" : "full-screen",
+      "idiom" : "iphone",
+      "subtype" : "736h",
+      "filename" : "Default-Landscape-736h.png",
+      "minimum-system-version" : "8.0",
+      "orientation" : "landscape",
+      "scale" : "3x"
+    },
+    {
+      "extent" : "full-screen",
+      "idiom" : "iphone",
+      "subtype" : "667h",
+      "filename" : "Default-667h.png",
+      "minimum-system-version" : "8.0",
+      "orientation" : "portrait",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "filename" : "Default@2x~iphone.png",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "2x"
+    },
+    {
+      "extent" : "full-screen",
+      "idiom" : "iphone",
+      "subtype" : "retina4",
+      "filename" : "Default-568h@2x~iphone.png",
+      "minimum-system-version" : "7.0",
+      "orientation" : "portrait",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "filename" : "Default-Portrait~ipad.png",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "filename" : "Default-Landscape~ipad.png",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "filename" : "Default-Portrait@2x~ipad.png",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "filename" : "Default-Landscape@2x~ipad.png",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "filename" : "Default~iphone.png",
+      "extent" : "full-screen",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "filename" : "Default@2x~iphone.png",
+      "extent" : "full-screen",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "iphone",
+      "filename" : "Default-568h@2x~iphone.png",
+      "extent" : "full-screen",
+      "subtype" : "retina4",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "extent" : "to-status-bar",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "filename" : "Default-Portrait~ipad.png",
+      "extent" : "full-screen",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "extent" : "to-status-bar",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "extent" : "to-status-bar",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "filename" : "Default-Portrait@2x~ipad.png",
+      "extent" : "full-screen",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "extent" : "to-status-bar",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "scale" : "2x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-568h@2x~iphone.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-568h@2x~iphone.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-568h@2x~iphone.png
new file mode 100644
index 0000000..10ed683
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-568h@2x~iphone.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-667h.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-667h.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-667h.png
new file mode 100644
index 0000000..d9bcf61
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-667h.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-736h.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-736h.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-736h.png
new file mode 100644
index 0000000..1fcef22
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-736h.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Landscape-736h.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Landscape-736h.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Landscape-736h.png
new file mode 100644
index 0000000..eae0792
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Landscape-736h.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png
new file mode 100644
index 0000000..1fc8c7d
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png
new file mode 100644
index 0000000..58ea2fb
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png
new file mode 100644
index 0000000..1570b37
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png
new file mode 100644
index 0000000..223e75d
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default@2x~iphone.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default@2x~iphone.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default@2x~iphone.png
new file mode 100644
index 0000000..0098dc7
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default@2x~iphone.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default~iphone.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default~iphone.png b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default~iphone.png
new file mode 100644
index 0000000..42b8fde
Binary files /dev/null and b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchImage.launchimage/Default~iphone.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchStoryboard.imageset/Contents.json
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchStoryboard.imageset/Contents.json b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchStoryboard.imageset/Contents.json
new file mode 100644
index 0000000..71f82ac
--- /dev/null
+++ b/tests/spec/unit/fixtures/ios-config-xml/SampleApp/Images.xcassets/LaunchStoryboard.imageset/Contents.json
@@ -0,0 +1,168 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "1x",
+      "height-class" : "compact"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x",
+      "height-class" : "compact"
+    },
+    {
+      "idiom" : "universal",
+      "height-class" : "compact",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "1x",
+      "width-class" : "compact"
+    },
+    {
+      "idiom" : "universal",
+      "width-class" : "compact",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "width-class" : "compact",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "universal",
+      "width-class" : "compact",
+      "height-class" : "compact",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "width-class" : "compact",
+      "height-class" : "compact",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "width-class" : "compact",
+      "height-class" : "compact",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "1x",
+      "height-class" : "compact"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "height-class" : "compact"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "height-class" : "compact"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "1x",
+      "width-class" : "compact"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "width-class" : "compact"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "width-class" : "compact"
+    },
+    {
+      "idiom" : "iphone",
+      "width-class" : "compact",
+      "height-class" : "compact",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "iphone",
+      "width-class" : "compact",
+      "height-class" : "compact",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "width-class" : "compact",
+      "height-class" : "compact",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "height-class" : "compact"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "height-class" : "compact"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "width-class" : "compact"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "width-class" : "compact"
+    },
+    {
+      "idiom" : "ipad",
+      "width-class" : "compact",
+      "height-class" : "compact",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "width-class" : "compact",
+      "height-class" : "compact",
+      "scale" : "2x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/configs/legacy-only.xml
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/configs/legacy-only.xml b/tests/spec/unit/fixtures/launch-storyboard-support/configs/legacy-only.xml
new file mode 100644
index 0000000..2917aac
--- /dev/null
+++ b/tests/spec/unit/fixtures/launch-storyboard-support/configs/legacy-only.xml
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='utf-8'?>
+<widget android-packageName="io.cordova.hellocordova.android" id="io.cordova.hellocordova" ios-CFBundleIdentifier="io.cordova.hellocordova.ios" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
+    <name>Hello Cordova</name>
+    <description>
+        A sample Apache Cordova application that responds to the deviceready event.
+    </description>
+    <author email="dev@cordova.apache.org" href="http://cordova.io">
+        Apache Cordova Team
+    </author>
+    <content src="index.html" />
+
+    <platform name="ios">
+        <preference name="orientation" value="all" />
+        <preference name="target-device" value="handset" />
+        <preference name="deployment-target" value="8.0" />
+
+        <splash src="res/screen/ios/Default~iphone.png" width="320" height="480"/>
+        <splash src="res/screen/ios/Default@2x~iphone.png" width="640" height="960"/>
+        <splash src="res/screen/ios/Default-Portrait~ipad.png" width="768" height="1024"/>
+        <splash src="res/screen/ios/Default-Portrait@2x~ipad.png" width="1536" height="2048"/>
+        <splash src="res/screen/ios/Default-Landscape~ipad.png" width="1024" height="768"/>
+        <splash src="res/screen/ios/Default-Landscape@2x~ipad.png" width="2048" height="1536"/>
+        <splash src="res/screen/ios/Default-568h@2x~iphone.png" width="640" height="1136"/>
+        <splash src="res/screen/ios/Default-667h.png" width="750" height="1334"/>
+        <splash src="res/screen/ios/Default-736h.png" width="1242" height="2208"/>
+        <splash src="res/screen/ios/Default-Landscape-736h.png" width="2208" height="1242"/>
+    </platform>
+
+    <access origin="http://*.apache.org" />
+    <access origin="https://*.apache.org" />
+
+    <allow-navigation href="http://*.apache.org" />
+    <allow-navigation href="https://*.apache.org" />
+    �
+</widget>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/configs/modern-and-legacy.xml
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/configs/modern-and-legacy.xml b/tests/spec/unit/fixtures/launch-storyboard-support/configs/modern-and-legacy.xml
new file mode 100644
index 0000000..1bf60ae
--- /dev/null
+++ b/tests/spec/unit/fixtures/launch-storyboard-support/configs/modern-and-legacy.xml
@@ -0,0 +1,42 @@
+<?xml version='1.0' encoding='utf-8'?>
+<widget android-packageName="io.cordova.hellocordova.android" id="io.cordova.hellocordova" ios-CFBundleIdentifier="io.cordova.hellocordova.ios" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
+    <name>Hello Cordova</name>
+    <description>
+        A sample Apache Cordova application that responds to the deviceready event.
+    </description>
+    <author email="dev@cordova.apache.org" href="http://cordova.io">
+        Apache Cordova Team
+    </author>
+    <content src="index.html" />
+
+    <platform name="ios">
+        <preference name="orientation" value="all" />
+        <preference name="target-device" value="handset" />
+        <preference name="deployment-target" value="8.0" />
+
+        <splash src="res/screen/ios/Default~iphone.png" width="320" height="480"/>
+        <splash src="res/screen/ios/Default@2x~iphone.png" width="640" height="960"/>
+        <splash src="res/screen/ios/Default-Portrait~ipad.png" width="768" height="1024"/>
+        <splash src="res/screen/ios/Default-Portrait@2x~ipad.png" width="1536" height="2048"/>
+        <splash src="res/screen/ios/Default-Landscape~ipad.png" width="1024" height="768"/>
+        <splash src="res/screen/ios/Default-Landscape@2x~ipad.png" width="2048" height="1536"/>
+        <splash src="res/screen/ios/Default-568h@2x~iphone.png" width="640" height="1136"/>
+        <splash src="res/screen/ios/Default-667h.png" width="750" height="1334"/>
+        <splash src="res/screen/ios/Default-736h.png" width="1242" height="2208"/>
+        <splash src="res/screen/ios/Default-Landscape-736h.png" width="2208" height="1242"/>
+
+        <splash src="res/screen/ios/Default@2x~universal~anyany.png" />
+        <splash src="res/screen/ios/Default@2x~universal~comany.png" />
+        <splash src="res/screen/ios/Default@2x~universal~comcom.png" />
+        <splash src="res/screen/ios/Default@3x~universal~anyany.png" />
+        <splash src="res/screen/ios/Default@3x~universal~anycom.png" />
+        <splash src="res/screen/ios/Default@3x~universal~comany.png" />
+    </platform>
+
+    <access origin="http://*.apache.org" />
+    <access origin="https://*.apache.org" />
+
+    <allow-navigation href="http://*.apache.org" />
+    <allow-navigation href="https://*.apache.org" />
+    �
+</widget>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/configs/modern-only.xml
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/configs/modern-only.xml b/tests/spec/unit/fixtures/launch-storyboard-support/configs/modern-only.xml
new file mode 100644
index 0000000..5548897
--- /dev/null
+++ b/tests/spec/unit/fixtures/launch-storyboard-support/configs/modern-only.xml
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='utf-8'?>
+<widget android-packageName="io.cordova.hellocordova.android" id="io.cordova.hellocordova" ios-CFBundleIdentifier="io.cordova.hellocordova.ios" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
+    <name>Hello Cordova</name>
+    <description>
+        A sample Apache Cordova application that responds to the deviceready event.
+    </description>
+    <author email="dev@cordova.apache.org" href="http://cordova.io">
+        Apache Cordova Team
+    </author>
+    <content src="index.html" />
+
+    <platform name="ios">
+        <preference name="orientation" value="all" />
+        <preference name="target-device" value="handset" />
+        <preference name="deployment-target" value="8.0" />
+
+        <splash src="res/screen/ios/Default@2x~universal~anyany.png" />
+        <splash src="res/screen/ios/Default@2x~universal~comany.png" />
+        <splash src="res/screen/ios/Default@2x~universal~comcom.png" />
+        <splash src="res/screen/ios/Default@3x~universal~anyany.png" />
+        <splash src="res/screen/ios/Default@3x~universal~anycom.png" />
+        <splash src="res/screen/ios/Default@3x~universal~comany.png" />
+    </platform>
+
+    <access origin="http://*.apache.org" />
+    <access origin="https://*.apache.org" />
+
+    <allow-navigation href="http://*.apache.org" />
+    <allow-navigation href="https://*.apache.org" />
+    �
+</widget>
+

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/configs/none.xml
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/configs/none.xml b/tests/spec/unit/fixtures/launch-storyboard-support/configs/none.xml
new file mode 100644
index 0000000..1dc7487
--- /dev/null
+++ b/tests/spec/unit/fixtures/launch-storyboard-support/configs/none.xml
@@ -0,0 +1,24 @@
+<?xml version='1.0' encoding='utf-8'?>
+<widget android-packageName="io.cordova.hellocordova.android" id="io.cordova.hellocordova" ios-CFBundleIdentifier="io.cordova.hellocordova.ios" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
+    <name>Hello Cordova</name>
+    <description>
+        A sample Apache Cordova application that responds to the deviceready event.
+    </description>
+    <author email="dev@cordova.apache.org" href="http://cordova.io">
+        Apache Cordova Team
+    </author>
+    <content src="index.html" />
+
+    <platform name="ios">
+        <preference name="orientation" value="all" />
+        <preference name="target-device" value="handset" />
+        <preference name="deployment-target" value="8.0" />
+    </platform>
+
+    <access origin="http://*.apache.org" />
+    <access origin="https://*.apache.org" />
+
+    <allow-navigation href="http://*.apache.org" />
+    <allow-navigation href="https://*.apache.org" />
+    �
+</widget>

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/empty.js
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/empty.js b/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/empty.js
new file mode 100644
index 0000000..6b7663a
--- /dev/null
+++ b/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/empty.js
@@ -0,0 +1,135 @@
+module.exports = {
+    "images": [{
+        "idiom": "universal",
+        "scale": "1x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "1x",
+        "width-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "1x",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "1x"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "width-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "2x"
+    }, {
+        "idiom": "universal",
+        "scale": "3x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "3x",
+        "width-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "3x",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "3x"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x"
+    }],
+    "info": {
+        "author": "Xcode",
+        "version": 1
+    }
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/single-2xanyany.js
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/single-2xanyany.js b/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/single-2xanyany.js
new file mode 100644
index 0000000..c58f6c4
--- /dev/null
+++ b/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/single-2xanyany.js
@@ -0,0 +1,136 @@
+module.exports = {
+    "images": [{
+        "idiom": "universal",
+        "scale": "1x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "1x",
+        "width-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "1x",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "1x"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "width-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "filename": "Default@2x~universal~anyany.png"
+    }, {
+        "idiom": "universal",
+        "scale": "3x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "3x",
+        "width-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "3x",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "3x"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x"
+    }],
+    "info": {
+        "author": "Xcode",
+        "version": 1
+    }
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/typical-universal.js
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/typical-universal.js b/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/typical-universal.js
new file mode 100644
index 0000000..0e8e986
--- /dev/null
+++ b/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/typical-universal.js
@@ -0,0 +1,141 @@
+module.exports = {
+    "images": [{
+        "idiom": "universal",
+        "scale": "1x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "1x",
+        "width-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "1x",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "1x"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "width-class": "compact",
+        "height-class": "compact",
+        "filename": "Default@2x~universal~comcom.png"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "width-class": "compact",
+        "filename": "Default@2x~universal~comany.png"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "filename": "Default@2x~universal~anyany.png"
+    }, {
+        "idiom": "universal",
+        "scale": "3x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "3x",
+        "width-class": "compact",
+        "filename": "Default@3x~universal~comany.png"
+    }, {
+        "idiom": "universal",
+        "scale": "3x",
+        "height-class": "compact",
+        "filename": "Default@3x~universal~anycom.png"
+    }, {
+        "idiom": "universal",
+        "scale": "3x",
+        "filename": "Default@3x~universal~anyany.png"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x"
+    }],
+    "info": {
+        "author": "Xcode",
+        "version": 1
+    }
+};

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/varied-device.js
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/varied-device.js b/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/varied-device.js
new file mode 100644
index 0000000..548ea04
--- /dev/null
+++ b/tests/spec/unit/fixtures/launch-storyboard-support/contents-json/varied-device.js
@@ -0,0 +1,144 @@
+module.exports = {
+    "images": [{
+        "idiom": "universal",
+        "scale": "1x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "1x",
+        "width-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "1x",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "1x"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "width-class": "compact",
+        "height-class": "compact",
+        "filename": "Default@2x~universal~comcom.png"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "width-class": "compact",
+        "filename": "Default@2x~universal~comany.png"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "2x",
+        "filename": "Default@2x~universal~anyany.png"
+    }, {
+        "idiom": "universal",
+        "scale": "3x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "3x",
+        "width-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "3x",
+        "height-class": "compact"
+    }, {
+        "idiom": "universal",
+        "scale": "3x"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "1x"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width-class": "compact",
+        "height-class": "compact",
+        "filename": "Default@2x~ipad~comcom.png"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width-class": "compact",
+        "filename": "Default@2x~ipad~comany.png"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x",
+        "height-class": "compact"
+    }, {
+        "idiom": "ipad",
+        "scale": "2x",
+        "filename": "Default@2x~ipad~anyany.png"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "1x"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "2x"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width-class": "compact",
+        "height-class": "compact"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width-class": "compact",
+        "filename": "Default@3x~iphone~comany.png"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x",
+        "height-class": "compact",
+        "filename": "Default@3x~iphone~anycom.png"
+    }, {
+        "idiom": "iphone",
+        "scale": "3x",
+        "filename": "Default@3x~iphone~anyany.png"
+    }],
+    "info": {
+        "author": "Xcode",
+        "version": 1
+    }
+};

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/empty-map.js
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/empty-map.js b/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/empty-map.js
new file mode 100644
index 0000000..36d8a81
--- /dev/null
+++ b/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/empty-map.js
@@ -0,0 +1,194 @@
+module.exports = [
+  {
+    "idiom": "universal",
+    "scale": "1x",
+    "width": "com",
+    "height": "com"
+  },
+  {
+    "idiom": "universal",
+    "scale": "1x",
+    "width": "com",
+    "height": "any"
+  },
+  {
+    "idiom": "universal",
+    "scale": "1x",
+    "width": "any",
+    "height": "com"
+  },
+  {
+    "idiom": "universal",
+    "scale": "1x",
+    "width": "any",
+    "height": "any"
+  },
+  {
+    "idiom": "universal",
+    "scale": "2x",
+    "width": "com",
+    "height": "com"
+  },
+  {
+    "idiom": "universal",
+    "scale": "2x",
+    "width": "com",
+    "height": "any"
+  },
+  {
+    "idiom": "universal",
+    "scale": "2x",
+    "width": "any",
+    "height": "com"
+  },
+  {
+    "idiom": "universal",
+    "scale": "2x",
+    "width": "any",
+    "height": "any"
+  },
+  {
+    "idiom": "universal",
+    "scale": "3x",
+    "width": "com",
+    "height": "com"
+  },
+  {
+    "idiom": "universal",
+    "scale": "3x",
+    "width": "com",
+    "height": "any"
+  },
+  {
+    "idiom": "universal",
+    "scale": "3x",
+    "width": "any",
+    "height": "com"
+  },
+  {
+    "idiom": "universal",
+    "scale": "3x",
+    "width": "any",
+    "height": "any"
+  },
+  {
+    "idiom": "ipad",
+    "scale": "1x",
+    "width": "com",
+    "height": "com"
+  },
+  {
+    "idiom": "ipad",
+    "scale": "1x",
+    "width": "com",
+    "height": "any"
+  },
+  {
+    "idiom": "ipad",
+    "scale": "1x",
+    "width": "any",
+    "height": "com"
+  },
+  {
+    "idiom": "ipad",
+    "scale": "1x",
+    "width": "any",
+    "height": "any"
+  },
+  {
+    "idiom": "ipad",
+    "scale": "2x",
+    "width": "com",
+    "height": "com"
+  },
+  {
+    "idiom": "ipad",
+    "scale": "2x",
+    "width": "com",
+    "height": "any"
+  },
+  {
+    "idiom": "ipad",
+    "scale": "2x",
+    "width": "any",
+    "height": "com"
+  },
+  {
+    "idiom": "ipad",
+    "scale": "2x",
+    "width": "any",
+    "height": "any"
+  },
+  {
+    "idiom": "iphone",
+    "scale": "1x",
+    "width": "com",
+    "height": "com"
+  },
+  {
+    "idiom": "iphone",
+    "scale": "1x",
+    "width": "com",
+    "height": "any"
+  },
+  {
+    "idiom": "iphone",
+    "scale": "1x",
+    "width": "any",
+    "height": "com"
+  },
+  {
+    "idiom": "iphone",
+    "scale": "1x",
+    "width": "any",
+    "height": "any"
+  },
+  {
+    "idiom": "iphone",
+    "scale": "2x",
+    "width": "com",
+    "height": "com"
+  },
+  {
+    "idiom": "iphone",
+    "scale": "2x",
+    "width": "com",
+    "height": "any"
+  },
+  {
+    "idiom": "iphone",
+    "scale": "2x",
+    "width": "any",
+    "height": "com"
+  },
+  {
+    "idiom": "iphone",
+    "scale": "2x",
+    "width": "any",
+    "height": "any"
+  },
+  {
+    "idiom": "iphone",
+    "scale": "3x",
+    "width": "com",
+    "height": "com"
+  },
+  {
+    "idiom": "iphone",
+    "scale": "3x",
+    "width": "com",
+    "height": "any"
+  },
+  {
+    "idiom": "iphone",
+    "scale": "3x",
+    "width": "any",
+    "height": "com"
+  },
+  {
+    "idiom": "iphone",
+    "scale": "3x",
+    "width": "any",
+    "height": "any"
+  }
+];

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/single-2xanyany-map.js
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/single-2xanyany-map.js b/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/single-2xanyany-map.js
new file mode 100644
index 0000000..5d8ec3d
--- /dev/null
+++ b/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/single-2xanyany-map.js
@@ -0,0 +1,197 @@
+module.exports = [
+    {
+        "idiom": "universal",
+        "scale": "1x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "1x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "universal",
+        "scale": "1x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "1x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "universal",
+        "scale": "2x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "2x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "universal",
+        "scale": "2x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "2x",
+        "width": "any",
+        "height": "any",
+        "filename": "Default@2x~universal~anyany.png",
+        "src": "res/splash/ios/Default@2x~universal~anyany.png",
+        "target": "Default@2x~universal~anyany.png"
+    },
+    {
+        "idiom": "universal",
+        "scale": "3x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "3x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "universal",
+        "scale": "3x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "3x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width": "any",
+        "height": "any"
+    }
+];

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/typical-universal-map.js
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/typical-universal-map.js b/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/typical-universal-map.js
new file mode 100644
index 0000000..eef09ef
--- /dev/null
+++ b/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/typical-universal-map.js
@@ -0,0 +1,212 @@
+module.exports = [
+    {
+        "idiom": "universal",
+        "scale": "1x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "1x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "universal",
+        "scale": "1x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "1x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "universal",
+        "scale": "2x",
+        "width": "com",
+        "height": "com",
+        "filename": "Default@2x~universal~comcom.png",
+        "src": "res/splash/ios/Default@2x~universal~comcom.png",
+        "target": "Default@2x~universal~comcom.png"
+    },
+    {
+        "idiom": "universal",
+        "scale": "2x",
+        "width": "com",
+        "height": "any",
+        "filename": "Default@2x~universal~comany.png",
+        "src": "res/splash/ios/Default@2x~universal~comany.png",
+        "target": "Default@2x~universal~comany.png"
+    },
+    {
+        "idiom": "universal",
+        "scale": "2x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "2x",
+        "width": "any",
+        "height": "any",
+        "filename": "Default@2x~universal~anyany.png",
+        "src": "res/splash/ios/Default@2x~universal~anyany.png",
+        "target": "Default@2x~universal~anyany.png"
+    },
+    {
+        "idiom": "universal",
+        "scale": "3x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "3x",
+        "width": "com",
+        "height": "any",
+        "filename": "Default@3x~universal~comany.png",
+        "src": "res/splash/ios/Default@3x~universal~comany.png",
+        "target": "Default@3x~universal~comany.png"
+    },
+    {
+        "idiom": "universal",
+        "scale": "3x",
+        "width": "any",
+        "height": "com",
+        "filename": "Default@3x~universal~anycom.png",
+        "src": "res/splash/ios/Default@3x~universal~anycom.png",
+        "target": "Default@3x~universal~anycom.png"
+    },
+    {
+        "idiom": "universal",
+        "scale": "3x",
+        "width": "any",
+        "height": "any",
+        "filename": "Default@3x~universal~anyany.png",
+        "src": "res/splash/ios/Default@3x~universal~anyany.png",
+        "target": "Default@3x~universal~anyany.png"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width": "any",
+        "height": "any"
+    }
+];

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/varied-device-map.js
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/varied-device-map.js b/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/varied-device-map.js
new file mode 100644
index 0000000..e6d39ed
--- /dev/null
+++ b/tests/spec/unit/fixtures/launch-storyboard-support/contents-map/varied-device-map.js
@@ -0,0 +1,221 @@
+module.exports = [
+    {
+        "idiom": "universal",
+        "scale": "1x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "1x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "universal",
+        "scale": "1x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "1x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "universal",
+        "scale": "2x",
+        "width": "com",
+        "height": "com",
+        "filename": "Default@2x~universal~comcom.png",
+        "src": "res/splash/ios/Default@2x~universal~comcom.png",
+        "target": "Default@2x~universal~comcom.png"
+    },
+    {
+        "idiom": "universal",
+        "scale": "2x",
+        "width": "com",
+        "height": "any",
+        "filename": "Default@2x~universal~comany.png",
+        "src": "res/splash/ios/Default@2x~universal~comany.png",
+        "target": "Default@2x~universal~comany.png"
+    },
+    {
+        "idiom": "universal",
+        "scale": "2x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "2x",
+        "width": "any",
+        "height": "any",
+        "filename": "Default@2x~universal~anyany.png",
+        "src": "res/splash/ios/Default@2x~universal~anyany.png",
+        "target": "Default@2x~universal~anyany.png"
+    },
+    {
+        "idiom": "universal",
+        "scale": "3x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "3x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "universal",
+        "scale": "3x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "universal",
+        "scale": "3x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "1x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width": "com",
+        "height": "com",
+        "filename": "Default@2x~ipad~comcom.png",
+        "src": "res/splash/ios/Default@2x~ipad~comcom.png",
+        "target": "Default@2x~ipad~comcom.png"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width": "com",
+        "height": "any",
+        "filename": "Default@2x~ipad~comany.png",
+        "src": "res/splash/ios/Default@2x~ipad~comany.png",
+        "target": "Default@2x~ipad~comany.png"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "ipad",
+        "scale": "2x",
+        "width": "any",
+        "height": "any",
+        "filename": "Default@2x~ipad~anyany.png",
+        "src": "res/splash/ios/Default@2x~ipad~anyany.png",
+        "target": "Default@2x~ipad~anyany.png"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "1x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width": "com",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width": "any",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "2x",
+        "width": "any",
+        "height": "any"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width": "com",
+        "height": "com"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width": "com",
+        "height": "any",
+        "filename": "Default@3x~iphone~comany.png",
+        "src": "res/splash/ios/Default@3x~iphone~comany.png",
+        "target": "Default@3x~iphone~comany.png"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width": "any",
+        "height": "com",
+        "filename": "Default@3x~iphone~anycom.png",
+        "src": "res/splash/ios/Default@3x~iphone~anycom.png",
+        "target": "Default@3x~iphone~anycom.png"
+    },
+    {
+        "idiom": "iphone",
+        "scale": "3x",
+        "width": "any",
+        "height": "any",
+        "filename": "Default@3x~iphone~anyany.png",
+        "src": "res/splash/ios/Default@3x~iphone~anyany.png",
+        "target": "Default@3x~iphone~anyany.png"
+    }
+];

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@2x~universal~anyany.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@2x~universal~anyany.png b/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@2x~universal~anyany.png
new file mode 100644
index 0000000..1c647af
Binary files /dev/null and b/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@2x~universal~anyany.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@2x~universal~comany.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@2x~universal~comany.png b/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@2x~universal~comany.png
new file mode 100644
index 0000000..11ceaee
Binary files /dev/null and b/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@2x~universal~comany.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@2x~universal~comcom.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@2x~universal~comcom.png b/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@2x~universal~comcom.png
new file mode 100644
index 0000000..8927308
Binary files /dev/null and b/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@2x~universal~comcom.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@3x~universal~anyany.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@3x~universal~anyany.png b/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@3x~universal~anyany.png
new file mode 100644
index 0000000..21adbc0
Binary files /dev/null and b/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@3x~universal~anyany.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@3x~universal~anycom.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@3x~universal~anycom.png b/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@3x~universal~anycom.png
new file mode 100644
index 0000000..72b7250
Binary files /dev/null and b/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@3x~universal~anycom.png differ

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/4b864624/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@3x~universal~comany.png
----------------------------------------------------------------------
diff --git a/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@3x~universal~comany.png b/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@3x~universal~comany.png
new file mode 100644
index 0000000..3c2693f
Binary files /dev/null and b/tests/spec/unit/fixtures/launch-storyboard-support/res/screen/ios/Default@3x~universal~comany.png differ


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org