pulsar/spec/pane-container-element-spec.coffee
2017-09-10 15:46:40 +00:00

240 lines
8.1 KiB
CoffeeScript

PaneContainer = require '../src/pane-container'
PaneAxisElement = require '../src/pane-axis-element'
PaneAxis = require '../src/pane-axis'
params =
location: 'center'
config: atom.config
confirm: atom.confirm.bind(atom)
viewRegistry: atom.views
applicationDelegate: atom.applicationDelegate
describe "PaneContainerElement", ->
describe "when panes are added or removed", ->
it "inserts or removes resize elements", ->
childTagNames = ->
child.nodeName.toLowerCase() for child in paneAxisElement.children
paneAxis = new PaneAxis({}, atom.views)
paneAxisElement = paneAxis.getElement()
expect(childTagNames()).toEqual []
paneAxis.addChild(new PaneAxis({}, atom.views))
expect(childTagNames()).toEqual [
'atom-pane-axis'
]
paneAxis.addChild(new PaneAxis({}, atom.views))
expect(childTagNames()).toEqual [
'atom-pane-axis'
'atom-pane-resize-handle'
'atom-pane-axis'
]
paneAxis.addChild(new PaneAxis({}, atom.views))
expect(childTagNames()).toEqual [
'atom-pane-axis'
'atom-pane-resize-handle'
'atom-pane-axis'
'atom-pane-resize-handle'
'atom-pane-axis'
]
paneAxis.removeChild(paneAxis.getChildren()[2])
expect(childTagNames()).toEqual [
'atom-pane-axis'
'atom-pane-resize-handle'
'atom-pane-axis'
]
it "transfers focus to the next pane if a focused pane is removed", ->
container = new PaneContainer(params)
containerElement = container.getElement()
leftPane = container.getActivePane()
leftPaneElement = leftPane.getElement()
rightPane = leftPane.splitRight()
rightPaneElement = rightPane.getElement()
jasmine.attachToDOM(containerElement)
rightPaneElement.focus()
expect(document.activeElement).toBe rightPaneElement
rightPane.destroy()
expect(document.activeElement).toBe leftPaneElement
describe "when a pane is split", ->
it "builds appropriately-oriented atom-pane-axis elements", ->
container = new PaneContainer(params)
containerElement = container.getElement()
pane1 = container.getActivePane()
pane2 = pane1.splitRight()
pane3 = pane2.splitDown()
horizontalPanes = containerElement.querySelectorAll('atom-pane-container > atom-pane-axis.horizontal > atom-pane')
expect(horizontalPanes.length).toBe 1
expect(horizontalPanes[0]).toBe pane1.getElement()
verticalPanes = containerElement.querySelectorAll('atom-pane-container > atom-pane-axis.horizontal > atom-pane-axis.vertical > atom-pane')
expect(verticalPanes.length).toBe 2
expect(verticalPanes[0]).toBe pane2.getElement()
expect(verticalPanes[1]).toBe pane3.getElement()
pane1.destroy()
verticalPanes = containerElement.querySelectorAll('atom-pane-container > atom-pane-axis.vertical > atom-pane')
expect(verticalPanes.length).toBe 2
expect(verticalPanes[0]).toBe pane2.getElement()
expect(verticalPanes[1]).toBe pane3.getElement()
describe "when the resize element is dragged ", ->
[container, containerElement] = []
beforeEach ->
container = new PaneContainer(params)
containerElement = container.getElement()
document.querySelector('#jasmine-content').appendChild(containerElement)
dragElementToPosition = (element, clientX) ->
element.dispatchEvent(new MouseEvent('mousedown',
view: window
bubbles: true
button: 0
))
element.dispatchEvent(new MouseEvent 'mousemove',
view: window
bubbles: true
clientX: clientX
)
element.dispatchEvent(new MouseEvent 'mouseup',
iew: window
bubbles: true
button: 0
)
getElementWidth = (element) ->
element.getBoundingClientRect().width
expectPaneScale = (pairs...) ->
for [pane, expectedFlexScale] in pairs
expect(pane.getFlexScale()).toBeCloseTo(expectedFlexScale, 0.1)
getResizeElement = (i) ->
containerElement.querySelectorAll('atom-pane-resize-handle')[i]
getPaneElement = (i) ->
containerElement.querySelectorAll('atom-pane')[i]
it "adds and removes panes in the direction that the pane is being dragged", ->
leftPane = container.getActivePane()
expectPaneScale [leftPane, 1]
middlePane = leftPane.splitRight()
expectPaneScale [leftPane, 1], [middlePane, 1]
dragElementToPosition(
getResizeElement(0),
getElementWidth(getPaneElement(0)) / 2
)
expectPaneScale [leftPane, 0.5], [middlePane, 1.5]
rightPane = middlePane.splitRight()
expectPaneScale [leftPane, 0.5], [middlePane, 1.5], [rightPane, 1]
dragElementToPosition(
getResizeElement(1),
getElementWidth(getPaneElement(0)) + getElementWidth(getPaneElement(1)) / 2
)
expectPaneScale [leftPane, 0.5], [middlePane, 0.75], [rightPane, 1.75]
waitsForPromise -> middlePane.close()
runs -> expectPaneScale [leftPane, 0.44], [rightPane, 1.55]
waitsForPromise -> leftPane.close()
runs -> expectPaneScale [rightPane, 1]
it "splits or closes panes in orthogonal direction that the pane is being dragged", ->
leftPane = container.getActivePane()
expectPaneScale [leftPane, 1]
rightPane = leftPane.splitRight()
expectPaneScale [leftPane, 1], [rightPane, 1]
dragElementToPosition(
getResizeElement(0),
getElementWidth(getPaneElement(0)) / 2
)
expectPaneScale [leftPane, 0.5], [rightPane, 1.5]
# dynamically split pane, pane's flexScale will become to 1
lowerPane = leftPane.splitDown()
expectPaneScale [lowerPane, 1], [leftPane, 1], [leftPane.getParent(), 0.5]
# dynamically close pane, the pane's flexscale will recover to origin value
waitsForPromise -> lowerPane.close()
runs -> expectPaneScale [leftPane, 0.5], [rightPane, 1.5]
it "unsubscribes from mouse events when the pane is detached", ->
container.getActivePane().splitRight()
element = getResizeElement(0)
spyOn(document, 'addEventListener').andCallThrough()
spyOn(document, 'removeEventListener').andCallThrough()
spyOn(element, 'resizeStopped').andCallThrough()
element.dispatchEvent(new MouseEvent('mousedown',
view: window
bubbles: true
button: 0
))
waitsFor ->
document.addEventListener.callCount is 2
runs ->
expect(element.resizeStopped.callCount).toBe 0
container.destroy()
expect(element.resizeStopped.callCount).toBe 1
expect(document.removeEventListener.callCount).toBe 2
it "does not throw an error when resized to fit content in a detached state", ->
container.getActivePane().splitRight()
element = getResizeElement(0)
element.remove()
expect(-> element.resizeToFitContent()).not.toThrow()
describe "pane resizing", ->
[leftPane, rightPane] = []
beforeEach ->
container = new PaneContainer(params)
leftPane = container.getActivePane()
rightPane = leftPane.splitRight()
describe "when pane:increase-size is triggered", ->
it "increases the size of the pane", ->
expect(leftPane.getFlexScale()).toBe 1
expect(rightPane.getFlexScale()).toBe 1
atom.commands.dispatch(leftPane.getElement(), 'pane:increase-size')
expect(leftPane.getFlexScale()).toBe 1.1
expect(rightPane.getFlexScale()).toBe 1
atom.commands.dispatch(rightPane.getElement(), 'pane:increase-size')
expect(leftPane.getFlexScale()).toBe 1.1
expect(rightPane.getFlexScale()).toBe 1.1
describe "when pane:decrease-size is triggered", ->
it "decreases the size of the pane", ->
expect(leftPane.getFlexScale()).toBe 1
expect(rightPane.getFlexScale()).toBe 1
atom.commands.dispatch(leftPane.getElement(), 'pane:decrease-size')
expect(leftPane.getFlexScale()).toBe 1/1.1
expect(rightPane.getFlexScale()).toBe 1
atom.commands.dispatch(rightPane.getElement(), 'pane:decrease-size')
expect(leftPane.getFlexScale()).toBe 1/1.1
expect(rightPane.getFlexScale()).toBe 1/1.1