mirror of
https://github.com/atom/atom.git
synced 2026-02-11 07:05:11 -05:00
Previously, when calling `destroy` on a `PanelContainer` containing multiple panels, Atom would throw a `Cannot read property 'destroy' of undefined` exception. This was due to iterating over the panels while at the same time destroying them, which caused the iterated array to be modified during the loop. With this commit we slice the array before iterating over it so that destroying a `PanelContainer` doesn't throw exceptions anymore.
114 lines
4.2 KiB
CoffeeScript
114 lines
4.2 KiB
CoffeeScript
Panel = require '../src/panel'
|
|
PanelContainer = require '../src/panel-container'
|
|
|
|
describe "PanelContainer", ->
|
|
[container] = []
|
|
|
|
class TestPanelItem
|
|
constructor: ->
|
|
|
|
beforeEach ->
|
|
container = new PanelContainer
|
|
|
|
describe "::addPanel(panel)", ->
|
|
it 'emits an onDidAddPanel event with the index the panel was inserted at', ->
|
|
container.onDidAddPanel addPanelSpy = jasmine.createSpy()
|
|
|
|
panel1 = new Panel(item: new TestPanelItem())
|
|
container.addPanel(panel1)
|
|
expect(addPanelSpy).toHaveBeenCalledWith({panel: panel1, index: 0})
|
|
|
|
panel2 = new Panel(item: new TestPanelItem())
|
|
container.addPanel(panel2)
|
|
expect(addPanelSpy).toHaveBeenCalledWith({panel: panel2, index: 1})
|
|
|
|
describe "when a panel is destroyed", ->
|
|
it 'emits an onDidRemovePanel event with the index of the removed item', ->
|
|
container.onDidRemovePanel removePanelSpy = jasmine.createSpy()
|
|
|
|
panel1 = new Panel(item: new TestPanelItem())
|
|
container.addPanel(panel1)
|
|
panel2 = new Panel(item: new TestPanelItem())
|
|
container.addPanel(panel2)
|
|
|
|
expect(removePanelSpy).not.toHaveBeenCalled()
|
|
|
|
panel2.destroy()
|
|
expect(removePanelSpy).toHaveBeenCalledWith({panel: panel2, index: 1})
|
|
|
|
panel1.destroy()
|
|
expect(removePanelSpy).toHaveBeenCalledWith({panel: panel1, index: 0})
|
|
|
|
describe "::destroy()", ->
|
|
it "destroys the container and all of its panels", ->
|
|
destroyedPanels = []
|
|
|
|
panel1 = new Panel(item: new TestPanelItem())
|
|
panel1.onDidDestroy -> destroyedPanels.push(panel1)
|
|
container.addPanel(panel1)
|
|
|
|
panel2 = new Panel(item: new TestPanelItem())
|
|
panel2.onDidDestroy -> destroyedPanels.push(panel2)
|
|
container.addPanel(panel2)
|
|
|
|
container.destroy()
|
|
|
|
expect(container.getPanels().length).toBe(0)
|
|
expect(destroyedPanels).toEqual([panel1, panel2])
|
|
|
|
describe "panel priority", ->
|
|
describe 'left / top panel container', ->
|
|
[initialPanel] = []
|
|
beforeEach ->
|
|
# 'left' logic is the same as 'top'
|
|
container = new PanelContainer({location: 'left'})
|
|
initialPanel = new Panel(item: new TestPanelItem())
|
|
container.addPanel(initialPanel)
|
|
|
|
describe 'when a panel with low priority is added', ->
|
|
it 'is inserted at the beginning of the list', ->
|
|
container.onDidAddPanel addPanelSpy = jasmine.createSpy()
|
|
panel = new Panel(item: new TestPanelItem(), priority: 0)
|
|
container.addPanel(panel)
|
|
|
|
expect(addPanelSpy).toHaveBeenCalledWith({panel, index: 0})
|
|
expect(container.getPanels()[0]).toBe panel
|
|
|
|
describe 'when a panel with priority between two other panels is added', ->
|
|
it 'is inserted at the between the two panels', ->
|
|
panel = new Panel(item: new TestPanelItem(), priority: 1000)
|
|
container.addPanel(panel)
|
|
|
|
container.onDidAddPanel addPanelSpy = jasmine.createSpy()
|
|
panel = new Panel(item: new TestPanelItem(), priority: 101)
|
|
container.addPanel(panel)
|
|
|
|
expect(addPanelSpy).toHaveBeenCalledWith({panel, index: 1})
|
|
expect(container.getPanels()[1]).toBe panel
|
|
|
|
describe 'right / bottom panel container', ->
|
|
[initialPanel] = []
|
|
beforeEach ->
|
|
# 'bottom' logic is the same as 'right'
|
|
container = new PanelContainer({location: 'right'})
|
|
initialPanel = new Panel(item: new TestPanelItem())
|
|
container.addPanel(initialPanel)
|
|
|
|
describe 'when a panel with high priority is added', ->
|
|
it 'is inserted at the beginning of the list', ->
|
|
container.onDidAddPanel addPanelSpy = jasmine.createSpy()
|
|
panel = new Panel(item: new TestPanelItem(), priority: 1000)
|
|
container.addPanel(panel)
|
|
|
|
expect(addPanelSpy).toHaveBeenCalledWith({panel, index: 0})
|
|
expect(container.getPanels()[0]).toBe panel
|
|
|
|
describe 'when a panel with low priority is added', ->
|
|
it 'is inserted at the end of the list', ->
|
|
container.onDidAddPanel addPanelSpy = jasmine.createSpy()
|
|
panel = new Panel(item: new TestPanelItem(), priority: 0)
|
|
container.addPanel(panel)
|
|
|
|
expect(addPanelSpy).toHaveBeenCalledWith({panel, index: 1})
|
|
expect(container.getPanels()[1]).toBe panel
|