pulsar/spec/decoration-manager-spec.coffee
Antonio Scandurra 6a083e14a2 Schedule component updates directly from the model
The only event-based APIs we kept are for listening to changes in block
decoration markers.
2017-05-05 09:29:29 +02:00

97 lines
4.8 KiB
CoffeeScript

DecorationManager = require '../src/decoration-manager'
TextEditor = require '../src/text-editor'
describe "DecorationManager", ->
[decorationManager, buffer, editor, markerLayer1, markerLayer2] = []
beforeEach ->
buffer = atom.project.bufferForPathSync('sample.js')
editor = new TextEditor({buffer})
markerLayer1 = editor.addMarkerLayer()
markerLayer2 = editor.addMarkerLayer()
decorationManager = new DecorationManager(editor)
waitsForPromise ->
atom.packages.activatePackage('language-javascript')
afterEach ->
buffer.destroy()
describe "decorations", ->
[layer1Marker, layer2Marker, layer1MarkerDecoration, layer2MarkerDecoration, decorationProperties] = []
beforeEach ->
layer1Marker = markerLayer1.markBufferRange([[2, 13], [3, 15]])
decorationProperties = {type: 'line-number', class: 'one'}
layer1MarkerDecoration = decorationManager.decorateMarker(layer1Marker, decorationProperties)
layer2Marker = markerLayer2.markBufferRange([[2, 13], [3, 15]])
layer2MarkerDecoration = decorationManager.decorateMarker(layer2Marker, decorationProperties)
it "can add decorations associated with markers and remove them", ->
expect(layer1MarkerDecoration).toBeDefined()
expect(layer1MarkerDecoration.getProperties()).toBe decorationProperties
expect(decorationManager.decorationsForScreenRowRange(2, 3)).toEqual {
"#{layer1Marker.id}": [layer1MarkerDecoration],
"#{layer2Marker.id}": [layer2MarkerDecoration]
}
layer1MarkerDecoration.destroy()
expect(decorationManager.decorationsForScreenRowRange(2, 3)[layer1Marker.id]).not.toBeDefined()
layer2MarkerDecoration.destroy()
expect(decorationManager.decorationsForScreenRowRange(2, 3)[layer2Marker.id]).not.toBeDefined()
it "will not fail if the decoration is removed twice", ->
layer1MarkerDecoration.destroy()
layer1MarkerDecoration.destroy()
it "does not allow destroyed markers to be decorated", ->
layer1Marker.destroy()
expect(->
decorationManager.decorateMarker(layer1Marker, {type: 'overlay', item: document.createElement('div')})
).toThrow("Cannot decorate a destroyed marker")
expect(decorationManager.getOverlayDecorations()).toEqual []
it "does not allow destroyed marker layers to be decorated", ->
layer = editor.addMarkerLayer()
layer.destroy()
expect(->
decorationManager.decorateMarkerLayer(layer, {type: 'highlight'})
).toThrow("Cannot decorate a destroyed marker layer")
describe "when a decoration is updated via Decoration::update()", ->
it "emits an 'updated' event containing the new and old params", ->
layer1MarkerDecoration.onDidChangeProperties updatedSpy = jasmine.createSpy()
layer1MarkerDecoration.setProperties type: 'line-number', class: 'two'
{oldProperties, newProperties} = updatedSpy.mostRecentCall.args[0]
expect(oldProperties).toEqual decorationProperties
expect(newProperties).toEqual {type: 'line-number', gutterName: 'line-number', class: 'two'}
describe "::getDecorations(properties)", ->
it "returns decorations matching the given optional properties", ->
expect(decorationManager.getDecorations()).toEqual [layer1MarkerDecoration, layer2MarkerDecoration]
expect(decorationManager.getDecorations(class: 'two').length).toEqual 0
expect(decorationManager.getDecorations(class: 'one').length).toEqual 2
describe "::decorateMarker", ->
describe "when decorating gutters", ->
[layer1Marker] = []
beforeEach ->
layer1Marker = markerLayer1.markBufferRange([[1, 0], [1, 0]])
it "creates a decoration that is both of 'line-number' and 'gutter' type when called with the 'line-number' type", ->
decorationProperties = {type: 'line-number', class: 'one'}
layer1MarkerDecoration = decorationManager.decorateMarker(layer1Marker, decorationProperties)
expect(layer1MarkerDecoration.isType('line-number')).toBe true
expect(layer1MarkerDecoration.isType('gutter')).toBe true
expect(layer1MarkerDecoration.getProperties().gutterName).toBe 'line-number'
expect(layer1MarkerDecoration.getProperties().class).toBe 'one'
it "creates a decoration that is only of 'gutter' type if called with the 'gutter' type and a 'gutterName'", ->
decorationProperties = {type: 'gutter', gutterName: 'test-gutter', class: 'one'}
layer1MarkerDecoration = decorationManager.decorateMarker(layer1Marker, decorationProperties)
expect(layer1MarkerDecoration.isType('gutter')).toBe true
expect(layer1MarkerDecoration.isType('line-number')).toBe false
expect(layer1MarkerDecoration.getProperties().gutterName).toBe 'test-gutter'
expect(layer1MarkerDecoration.getProperties().class).toBe 'one'