runs(function () {
     KeyBindingManager._initCommandAndKeyMaps();
     KeyBindingManager._setUserKeyMapFilePath(testPath + "/blank.json");
     KeyBindingManager._loadUserKeyMap();
     spyOn(Dialogs, 'showModalDialog').andCallFake(function (dlgClass, title, message, buttons) {
         return {done: function (callback) { callback(Dialogs.DIALOG_BTN_OK); } };
     });
 });
                runs(function () {
                    brackets.platform = platform;
                    var defKeyMap = getDefaultKeyMap();
                    populateDefaultKeyMap();
                    KeyBindingManager._initCommandAndKeyMaps();
                    expect(KeyBindingManager.getKeymap()).toEqual(defKeyMap);
                    KeyBindingManager._setUserKeyMapFilePath(testFilePath);
                    KeyBindingManager._loadUserKeyMap();
                    waits(300);

                    spyOn(Dialogs, 'showModalDialog').andCallFake(function (dlgClass, title, message, buttons) {
                        return {done: function (callback) { callback(Dialogs.DIALOG_BTN_OK); } };
                    });
                });
                runs(function () {
                    CommandManager.register("test copy command", "edit.copy", testCommandFn);
                    KeyBindingManager._initCommandAndKeyMaps();
                    KeyBindingManager._setUserKeyMapFilePath(testPath + "/reassignCopy.json");
                    KeyBindingManager._loadUserKeyMap();
                    waits(300);

                    spyOn(Dialogs, 'showModalDialog').andCallFake(function (dlgClass, title, message, buttons) {
                        var msgPrefix = Strings.ERROR_RESTRICTED_COMMANDS.replace("{0}", "");
                        expect(message).toMatch(msgPrefix);
                        expect(message).toMatch("edit.copy");
                        return {done: function (callback) { callback(Dialogs.DIALOG_BTN_OK); } };
                    });
                });
                runs(function () {
                    // The command map has to be empty for this test case. So we are intentionally NOT calling
                    // populateDefaultKeyMap() before loading the user key map.
                    KeyBindingManager._initCommandAndKeyMaps();
                    KeyBindingManager._setUserKeyMapFilePath(testPath + "/keymap.json");
                    KeyBindingManager._loadUserKeyMap();
                    waits(300);

                    spyOn(Dialogs, 'showModalDialog').andCallFake(function (dlgClass, title, message, buttons) {
                        var msgPrefix = Strings.ERROR_NONEXISTENT_COMMANDS.replace("{0}", "");
                        expect(message).toMatch(msgPrefix);
                        expect(message).toMatch("file.openFolder");
                        expect(message).toMatch("view.toggleSidebar");
                        return {done: function (callback) { callback(Dialogs.DIALOG_BTN_OK); } };
                    });
                });
                runs(function () {
                    brackets.platform = platform;
                    populateDefaultKeyMap();
                    KeyBindingManager._setUserKeyMapFilePath(testPath + "/duplicateShortcuts.json");
                    KeyBindingManager._initCommandAndKeyMaps();
                    KeyBindingManager._loadUserKeyMap();
                    waits(300);

                    spyOn(Dialogs, 'showModalDialog').andCallFake(function (dlgClass, title, message, buttons) {
                        var msgPrefix = Strings.ERROR_DUPLICATE_SHORTCUTS.replace("{0}", "");
                        expect(message).toMatch(msgPrefix);
                        expect(message).toMatch("Ctrl-2");
                        expect(message).toMatch("Alt-Ctrl-4");
                        return {done: function (callback) { callback(Dialogs.DIALOG_BTN_OK); } };
                    });
                });
                runs(function () {
                    brackets.platform = platform;
                    populateDefaultKeyMap();
                    KeyBindingManager._initCommandAndKeyMaps();
                    KeyBindingManager._setUserKeyMapFilePath(testPath + "/invalidKeys.json");
                    KeyBindingManager._loadUserKeyMap();
                    waits(300);

                    spyOn(Dialogs, 'showModalDialog').andCallFake(function (dlgClass, title, message, buttons) {
                        var msgPrefix = Strings.ERROR_INVALID_SHORTCUTS.replace("{0}", "");
                        expect(message).toMatch(msgPrefix);
                        expect(message).toMatch("command-2");
                        expect(message).toMatch("Option-Cmd-Backspace");
                        expect(message).toMatch("ctrl-kk");
                        expect(message).toMatch("cmd-Del");
                        return {done: function (callback) { callback(Dialogs.DIALOG_BTN_OK); } };
                    });
                });
                runs(function () {
                    brackets.platform = platform;
                    populateDefaultKeyMap();
                    KeyBindingManager._initCommandAndKeyMaps();
                    KeyBindingManager._setUserKeyMapFilePath(testFilePath);
                    KeyBindingManager._loadUserKeyMap();
                    waits(300);

                    spyOn(Dialogs, 'showModalDialog').andCallFake(function (dlgClass, title, message, buttons) {
                        var msgPrefix = Strings.ERROR_RESTRICTED_SHORTCUTS.replace("{0}", "");
                        expect(message).toMatch(msgPrefix);
                        if (platform === "mac") {
                            expect(message).toMatch("cmd-z");
                            expect(message).toMatch("Cmd-m");
                            expect(message).toMatch("cmd-h");
                        } else {
                            expect(message).toMatch("ctrl-z");
                        }
                        return {done: function (callback) { callback(Dialogs.DIALOG_BTN_OK); } };
                    });
                });