From 9977884a2c73e34a89dbda3fce89c605342ff084 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 14 Jan 2014 17:30:38 -0700 Subject: [PATCH] Move ::destroyItem specs from pane-view-spec to pane-spec --- spec/pane-spec.coffee | 102 ++++++++++++++++++++++++++++------ spec/pane-view-spec.coffee | 109 ++++--------------------------------- 2 files changed, 96 insertions(+), 115 deletions(-) diff --git a/spec/pane-spec.coffee b/spec/pane-spec.coffee index ad0798ebc..9441ef976 100644 --- a/spec/pane-spec.coffee +++ b/spec/pane-spec.coffee @@ -4,7 +4,7 @@ PaneAxis = require '../src/pane-axis' PaneContainer = require '../src/pane-container' describe "Pane", -> - class Item + class Item extends Model constructor: (@name) -> describe "construction", -> @@ -29,6 +29,91 @@ describe "Pane", -> expect(item in pane.items).toBe true expect(pane.activeItem).toBe item + describe "::destroyItem(item)", -> + [pane, item1, item2, item3] = [] + + beforeEach -> + pane = new Pane(items: [new Item("A"), new Item("B"), new Item("C")]) + [item1, item2, item3] = pane.items + + it "removes the item from the items list and activates the next item if it was the active item", -> + expect(pane.activeItem).toBe item1 + pane.destroyItem(item2) + expect(item2 in pane.items).toBe false + expect(pane.activeItem).toBe item1 + + pane.destroyItem(item1) + expect(item1 in pane.items).toBe false + expect(pane.activeItem).toBe item3 + + it "emits 'item-removed' with the item, its index, and true indicating the item is being destroyed", -> + pane.on 'item-removed', itemRemovedHandler = jasmine.createSpy("itemRemovedHandler") + pane.destroyItem(item2) + expect(itemRemovedHandler).toHaveBeenCalledWith(item2, 1, true) + + describe "if the item is modified", -> + itemUri = null + + beforeEach -> + item1.shouldPromptToSave = -> true + item1.save = jasmine.createSpy("save") + item1.saveAs = jasmine.createSpy("saveAs") + item1.getUri = -> itemUri + + describe "if the [Save] option is selected", -> + describe "when the item has a uri", -> + it "saves the item before destroying it", -> + itemUri = "test" + spyOn(atom, 'confirm').andReturn(0) + pane.destroyItem(item1) + + expect(item1.save).toHaveBeenCalled() + expect(item1 in pane.items).toBe false + expect(item1.isDestroyed()).toBe true + + describe "when the item has no uri", -> + it "presents a save-as dialog, then saves the item with the given uri before removing and destroying it", -> + itemUri = null + + spyOn(atom, 'showSaveDialogSync').andReturn("/selected/path") + spyOn(atom, 'confirm').andReturn(0) + pane.destroyItem(item1) + + expect(atom.showSaveDialogSync).toHaveBeenCalled() + expect(item1.saveAs).toHaveBeenCalledWith("/selected/path") + expect(item1 in pane.items).toBe false + expect(item1.isDestroyed()).toBe true + + describe "if the [Don't Save] option is selected", -> + it "removes and destroys the item without saving it", -> + spyOn(atom, 'confirm').andReturn(2) + pane.destroyItem(item1) + + expect(item1.save).not.toHaveBeenCalled() + expect(item1 in pane.items).toBe false + expect(item1.isDestroyed()).toBe true + + describe "if the [Cancel] option is selected", -> + it "does not save, remove, or destroy the item", -> + spyOn(atom, 'confirm').andReturn(1) + pane.destroyItem(item1) + + expect(item1.save).not.toHaveBeenCalled() + expect(item1 in pane.items).toBe true + expect(item1.isDestroyed()).toBe false + + describe "when the last item is destroyed", -> + it "destroys the pane", -> + pane.destroyItem(item) for item in pane.getItems() + expect(pane.isDestroyed()).toBe true + + describe "when an item emits a destroyed event", -> + it "removes it from the list of items", -> + pane = new Pane(items: [new Model, new Model, new Model]) + [item1, item2, item3] = pane.items + pane.items[1].destroy() + expect(pane.items).toEqual [item1, item3] + describe "split methods", -> [pane1, container] = [] @@ -109,21 +194,6 @@ describe "Pane", -> pane2 = pane1.splitRight() expect(pane2.focused).toBe true - describe "::destroyItem(item)", -> - describe "when the last item is destroyed", -> - it "destroys the pane", -> - pane = new Pane(items: ["A", "B"]) - pane.destroyItem("A") - pane.destroyItem("B") - expect(pane.isDestroyed()).toBe true - - describe "when an item emits a destroyed event", -> - it "removes it from the list of items", -> - pane = new Pane(items: [new Model, new Model, new Model]) - [item1, item2, item3] = pane.items - pane.items[1].destroy() - expect(pane.items).toEqual [item1, item3] - describe "::destroy()", -> [pane1, container] = [] diff --git a/spec/pane-view-spec.coffee b/spec/pane-view-spec.coffee index 8db8580e5..86076bb83 100644 --- a/spec/pane-view-spec.coffee +++ b/spec/pane-view-spec.coffee @@ -101,115 +101,26 @@ describe "PaneView", -> paneModel.activateItem(view2) expect(pane.itemViews.find('#view-2').length).toBe 1 - describe "::destroyItem(item)", -> - describe "if the item is not modified", -> - it "removes the item and tries to call destroy on it", -> - pane.destroyItem(editor2) - expect(pane.getItems().indexOf(editor2)).toBe -1 - expect(editor2.isDestroyed()).toBe true - - describe "if the item is modified", -> - beforeEach -> - jasmine.unspy(editor2, 'shouldPromptToSave') - spyOn(editor2, 'save') - spyOn(editor2, 'saveAs') - - editor2.insertText('a') - expect(editor2.isModified()).toBeTruthy() - - describe "if the [Save] option is selected", -> - describe "when the item has a uri", -> - it "saves the item before removing and destroying it", -> - spyOn(atom, 'confirm').andReturn(0) - pane.destroyItem(editor2) - - expect(editor2.save).toHaveBeenCalled() - expect(pane.getItems().indexOf(editor2)).toBe -1 - expect(editor2.isDestroyed()).toBe true - - describe "when the item has no uri", -> - it "presents a save-as dialog, then saves the item with the given uri before removing and destroying it", -> - editor2.buffer.setPath(undefined) - - spyOn(atom, 'showSaveDialogSync').andReturn("/selected/path") - spyOn(atom, 'confirm').andReturn(0) - pane.destroyItem(editor2) - - expect(atom.showSaveDialogSync).toHaveBeenCalled() - - expect(editor2.saveAs).toHaveBeenCalledWith("/selected/path") - expect(pane.getItems().indexOf(editor2)).toBe -1 - expect(editor2.isDestroyed()).toBe true - - describe "if the [Don't Save] option is selected", -> - it "removes and destroys the item without saving it", -> - spyOn(atom, 'confirm').andReturn(2) - pane.destroyItem(editor2) - - expect(editor2.save).not.toHaveBeenCalled() - expect(pane.getItems().indexOf(editor2)).toBe -1 - expect(editor2.isDestroyed()).toBe true - - describe "if the [Cancel] option is selected", -> - it "does not save, remove, or destroy the item", -> - spyOn(atom, 'confirm').andReturn(1) - pane.destroyItem(editor2) - - expect(editor2.save).not.toHaveBeenCalled() - expect(pane.getItems().indexOf(editor2)).not.toBe -1 - expect(editor2.isDestroyed()).toBe false - - it "removes the item's associated view", -> - view1.remove = (selector, keepData) -> @wasRemoved = not keepData - pane.destroyItem(view1) - expect(view1.wasRemoved).toBe true - - it "removes the item from the items list and shows the next item if it was showing", -> - pane.destroyItem(view1) - expect(pane.getItems()).toEqual [editor1, view2, editor2] - expect(pane.activeItem).toBe editor1 - - pane.activateItem(editor2) - pane.destroyItem(editor2) - expect(pane.getItems()).toEqual [editor1, view2] - expect(pane.activeItem).toBe editor1 - - it "triggers 'pane:item-removed' with the item and its former index", -> + describe "when an item is destroyed", -> + it "triggers the 'pane:item-removed' event with the item and its former index", -> itemRemovedHandler = jasmine.createSpy("itemRemovedHandler") pane.on 'pane:item-removed', itemRemovedHandler - pane.destroyItem(editor1) + paneModel.destroyItem(editor1) expect(itemRemovedHandler).toHaveBeenCalled() expect(itemRemovedHandler.argsForCall[0][1..2]).toEqual [editor1, 1] - describe "when removing the last item", -> - it "removes the pane", -> - pane.destroyItem(item) for item in pane.getItems() - expect(pane.hasParent()).toBeFalsy() - - describe "when the pane is focused", -> - it "shifts focus to the next pane", -> - expect(container.getRoot()).toBe pane - container.attachToDom() - pane2 = pane.splitRight(new TestView(id: 'view-3', text: 'View 3')) - pane.focus() - expect(pane).toMatchSelector(':has(:focus)') - pane.destroyItem(item) for item in pane.getItems() - expect(pane2).toMatchSelector ':has(:focus)' - - describe "when the item is a view", -> + describe "when the destroyed item is a view", -> it "removes the item from the 'item-views' div", -> expect(view1.parent()).toMatchSelector pane.itemViews - pane.destroyItem(view1) + paneModel.destroyItem(view1) expect(view1.parent()).not.toMatchSelector pane.itemViews - describe "when the item is a model", -> - it "removes the associated view only when all items that require it have been removed", -> - pane.activateItem(editor1) - pane.activateItem(editor2) - pane.destroyItem(editor2) - expect(pane.itemViews.find('.editor')).toExist() + describe "when the destroyed item is a model", -> + it "removes the associated view", -> + paneModel.activateItem(editor1) + expect(pane.itemViews.find('.editor').length).toBe 1 pane.destroyItem(editor1) - expect(pane.itemViews.find('.editor')).not.toExist() + expect(pane.itemViews.find('.editor').length).toBe 0 describe "::moveItem(item, index)", -> it "moves the item to the given index and emits a 'pane:item-moved' event with the item and the new index", ->