2012-12-19 06:47:20 +04:00
|
|
|
RootView = require 'root-view'
|
2013-01-04 02:10:11 +04:00
|
|
|
{$$} = require 'space-pen'
|
2013-03-13 01:42:24 +04:00
|
|
|
fs = require 'fs-utils'
|
2012-12-19 06:47:20 +04:00
|
|
|
|
2013-02-08 02:37:48 +04:00
|
|
|
describe "the `atom` global", ->
|
2013-02-08 00:17:34 +04:00
|
|
|
beforeEach ->
|
2013-02-20 04:18:25 +04:00
|
|
|
window.rootView = new RootView
|
2013-02-08 23:51:51 +04:00
|
|
|
|
2013-03-25 20:57:58 +04:00
|
|
|
describe "package lifecycle methods", ->
|
|
|
|
packageModule = null
|
2012-12-19 06:47:20 +04:00
|
|
|
|
|
|
|
beforeEach ->
|
2013-03-25 20:57:58 +04:00
|
|
|
packageModule = require "package-with-module"
|
2013-01-03 04:40:03 +04:00
|
|
|
|
|
|
|
afterEach ->
|
2013-03-25 20:57:58 +04:00
|
|
|
atom.deactivatePackages()
|
2012-12-19 06:47:20 +04:00
|
|
|
|
2013-03-25 20:57:58 +04:00
|
|
|
describe ".activatePackage(id)", ->
|
2013-03-26 03:55:21 +04:00
|
|
|
describe "atom packages", ->
|
|
|
|
stylesheetPath = null
|
2013-01-03 04:40:03 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
beforeEach ->
|
|
|
|
stylesheetPath = fs.resolveOnLoadPath("fixtures/packages/package-with-module/stylesheets/styles.css")
|
2013-01-09 21:20:19 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
afterEach ->
|
|
|
|
removeStylesheet(stylesheetPath)
|
2013-01-04 02:10:11 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
it "requires and activates the package's main module if it exists", ->
|
|
|
|
spyOn(packageModule, 'activate').andCallThrough()
|
|
|
|
atom.activatePackage("package-with-module")
|
|
|
|
expect(packageModule.activate).toHaveBeenCalledWith({})
|
2013-01-04 02:10:11 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
it "passes the package its previously serialized state if it exists", ->
|
|
|
|
pack = atom.activatePackage("package-with-module")
|
|
|
|
expect(pack.mainModule.someNumber).not.toBe 77
|
|
|
|
pack.mainModule.someNumber = 77
|
|
|
|
atom.deactivatePackage("package-with-module")
|
2013-01-04 02:10:11 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
pack.requireMainModule() # deactivating the package nukes its main module, so we require it again to spy on it
|
|
|
|
spyOn(pack.mainModule, 'activate').andCallThrough()
|
2013-01-04 02:10:11 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
atom.activatePackage("package-with-module")
|
|
|
|
expect(pack.mainModule.activate).toHaveBeenCalledWith({someNumber: 77})
|
2013-01-04 02:10:11 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
it "logs warning instead of throwing an exception if a package fails to load", ->
|
|
|
|
config.set("core.disabledPackages", [])
|
|
|
|
spyOn(console, "warn")
|
|
|
|
expect(-> atom.activatePackage("package-that-throws-an-exception")).not.toThrow()
|
|
|
|
expect(console.warn).toHaveBeenCalled()
|
2013-01-04 02:10:11 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
describe "keymap loading", ->
|
|
|
|
describe "when package.json does not contain a 'keymaps' manifest", ->
|
|
|
|
it "loads all the .cson/.json files in the keymaps directory", ->
|
|
|
|
element1 = $$ -> @div class: 'test-1'
|
|
|
|
element2 = $$ -> @div class: 'test-2'
|
|
|
|
element3 = $$ -> @div class: 'test-3'
|
2013-01-04 02:10:11 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
expect(keymap.bindingsForElement(element1)['ctrl-z']).toBeUndefined()
|
|
|
|
expect(keymap.bindingsForElement(element2)['ctrl-z']).toBeUndefined()
|
|
|
|
expect(keymap.bindingsForElement(element3)['ctrl-z']).toBeUndefined()
|
2013-01-04 02:10:11 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
atom.activatePackage("package-with-module")
|
2013-01-28 10:38:11 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
expect(keymap.bindingsForElement(element1)['ctrl-z']).toBe "test-1"
|
|
|
|
expect(keymap.bindingsForElement(element2)['ctrl-z']).toBe "test-2"
|
|
|
|
expect(keymap.bindingsForElement(element3)['ctrl-z']).toBeUndefined()
|
2013-02-09 05:19:45 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
describe "when package.json contains a 'keymaps' manifest", ->
|
|
|
|
it "loads only the keymaps specified by the manifest, in the specified order", ->
|
|
|
|
element1 = $$ -> @div class: 'test-1'
|
|
|
|
element3 = $$ -> @div class: 'test-3'
|
2013-03-23 06:46:32 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
expect(keymap.bindingsForElement(element1)['ctrl-z']).toBeUndefined()
|
2013-03-23 06:46:32 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
atom.activatePackage("package-with-keymaps-manifest")
|
2013-02-09 05:19:45 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
expect(keymap.bindingsForElement(element1)['ctrl-z']).toBe 'keymap-1'
|
|
|
|
expect(keymap.bindingsForElement(element1)['ctrl-n']).toBe 'keymap-2'
|
|
|
|
expect(keymap.bindingsForElement(element3)['ctrl-y']).toBeUndefined()
|
2013-02-09 05:19:45 +04:00
|
|
|
|
2013-03-26 03:55:21 +04:00
|
|
|
it "loads stylesheets associated with the package", ->
|
|
|
|
stylesheetPath = fs.resolveOnLoadPath("fixtures/packages/package-with-module/stylesheets/styles.css")
|
|
|
|
expect(stylesheetElementForId(stylesheetPath).length).toBe 0
|
|
|
|
atom.activatePackage("package-with-module")
|
|
|
|
expect(stylesheetElementForId(stylesheetPath).length).toBe 1
|
|
|
|
|
|
|
|
describe "textmate packages", ->
|
|
|
|
it "loads the package's grammars", ->
|
|
|
|
expect(syntax.selectGrammar("file.rb").name).toBe "Null Grammar"
|
|
|
|
atom.activatePackage('ruby.tmbundle', sync: true)
|
|
|
|
expect(syntax.selectGrammar("file.rb").name).toBe "Ruby"
|
2013-03-25 20:57:58 +04:00
|
|
|
|
|
|
|
describe ".deactivatePackage(id)", ->
|
2013-03-26 03:55:21 +04:00
|
|
|
describe "atom packages", ->
|
|
|
|
it "calls `deactivate` on the package's main module and deletes the package's module reference and require cache entry", ->
|
|
|
|
pack = atom.activatePackage("package-with-module")
|
|
|
|
expect(atom.getActivePackage("package-with-module")).toBe pack
|
|
|
|
spyOn(pack.mainModule, 'deactivate').andCallThrough()
|
|
|
|
|
|
|
|
atom.deactivatePackage("package-with-module")
|
|
|
|
expect(pack.mainModule.deactivate).toHaveBeenCalled()
|
|
|
|
expect(atom.getActivePackage("package-with-module")).toBeUndefined()
|
|
|
|
|
|
|
|
it "absorbs exceptions that are thrown by the package module's serialize methods", ->
|
|
|
|
spyOn(console, 'error')
|
|
|
|
atom.activatePackage('package-with-module', immediate: true)
|
|
|
|
atom.activatePackage('package-with-serialize-error', immediate: true)
|
|
|
|
atom.deactivatePackages()
|
|
|
|
expect(atom.packageStates['package-with-module']).toEqual someNumber: 1
|
|
|
|
expect(atom.packageStates['package-with-serialize-error']).toBeUndefined()
|
|
|
|
expect(console.error).toHaveBeenCalled()
|
|
|
|
|
|
|
|
describe "texmate packages", ->
|
|
|
|
it "removes the package's grammars", ->
|
|
|
|
expect(syntax.selectGrammar("file.rb").name).toBe "Null Grammar"
|
|
|
|
atom.activatePackage('ruby.tmbundle', sync: true)
|
|
|
|
expect(syntax.selectGrammar("file.rb").name).toBe "Ruby"
|
|
|
|
atom.deactivatePackage('ruby.tmbundle')
|
|
|
|
expect(syntax.selectGrammar("file.rb").name).toBe "Null Grammar"
|
2013-02-25 23:25:11 +04:00
|
|
|
|
|
|
|
describe ".getVersion(callback)", ->
|
|
|
|
it "calls the callback with the current version number", ->
|
|
|
|
versionHandler = jasmine.createSpy("versionHandler")
|
|
|
|
atom.getVersion(versionHandler)
|
|
|
|
waitsFor ->
|
|
|
|
versionHandler.callCount > 0
|
|
|
|
|
|
|
|
runs ->
|
2013-02-28 22:15:24 +04:00
|
|
|
expect(versionHandler.argsForCall[0][0]).toMatch /^\d+\.\d+(\.\d+)?$/
|
2013-03-02 02:52:21 +04:00
|
|
|
|
|
|
|
describe "modal native dialogs", ->
|
|
|
|
beforeEach ->
|
|
|
|
spyOn(atom, 'sendMessageToBrowserProcess')
|
|
|
|
atom.sendMessageToBrowserProcess.simulateConfirmation = (buttonText) ->
|
|
|
|
labels = @argsForCall[0][1][2...]
|
|
|
|
callbacks = @argsForCall[0][2]
|
|
|
|
@reset()
|
|
|
|
callbacks[labels.indexOf(buttonText)]()
|
2013-03-02 03:27:13 +04:00
|
|
|
advanceClock 50
|
2013-03-02 02:52:21 +04:00
|
|
|
|
|
|
|
atom.sendMessageToBrowserProcess.simulatePathSelection = (path) ->
|
|
|
|
callback = @argsForCall[0][2]
|
|
|
|
@reset()
|
|
|
|
callback(path)
|
2013-03-02 03:27:13 +04:00
|
|
|
advanceClock 50
|
2013-03-02 02:52:21 +04:00
|
|
|
|
|
|
|
it "only presents one native dialog at a time", ->
|
|
|
|
confirmHandler = jasmine.createSpy("confirmHandler")
|
|
|
|
selectPathHandler = jasmine.createSpy("selectPathHandler")
|
|
|
|
|
|
|
|
atom.confirm "Are you happy?", "really, truly happy?", "Yes", confirmHandler, "No"
|
|
|
|
atom.confirm "Are you happy?", "really, truly happy?", "Yes", confirmHandler, "No"
|
|
|
|
atom.showSaveDialog(selectPathHandler)
|
|
|
|
atom.showSaveDialog(selectPathHandler)
|
|
|
|
|
|
|
|
expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
|
|
|
|
atom.sendMessageToBrowserProcess.simulateConfirmation("Yes")
|
|
|
|
expect(confirmHandler).toHaveBeenCalled()
|
|
|
|
|
|
|
|
expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
|
|
|
|
atom.sendMessageToBrowserProcess.simulateConfirmation("No")
|
|
|
|
|
|
|
|
expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
|
|
|
|
atom.sendMessageToBrowserProcess.simulatePathSelection('/selected/path')
|
|
|
|
expect(selectPathHandler).toHaveBeenCalledWith('/selected/path')
|
|
|
|
selectPathHandler.reset()
|
|
|
|
|
|
|
|
expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
|
|
|
|
|
|
|
|
it "prioritizes dialogs presented as the result of dismissing other dialogs before any previously deferred dialogs", ->
|
|
|
|
atom.confirm "A1", "", "Next", ->
|
|
|
|
atom.confirm "B1", "", "Next", ->
|
|
|
|
atom.confirm "C1", "", "Next", ->
|
|
|
|
atom.confirm "C2", "", "Next", ->
|
|
|
|
atom.confirm "B2", "", "Next", ->
|
|
|
|
atom.confirm "A2", "", "Next", ->
|
|
|
|
|
|
|
|
expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
|
|
|
|
expect(atom.sendMessageToBrowserProcess.argsForCall[0][1][0]).toBe "A1"
|
|
|
|
atom.sendMessageToBrowserProcess.simulateConfirmation('Next')
|
|
|
|
|
|
|
|
expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
|
|
|
|
expect(atom.sendMessageToBrowserProcess.argsForCall[0][1][0]).toBe "B1"
|
|
|
|
atom.sendMessageToBrowserProcess.simulateConfirmation('Next')
|
|
|
|
|
|
|
|
expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
|
|
|
|
expect(atom.sendMessageToBrowserProcess.argsForCall[0][1][0]).toBe "C1"
|
|
|
|
atom.sendMessageToBrowserProcess.simulateConfirmation('Next')
|
|
|
|
|
|
|
|
expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
|
|
|
|
expect(atom.sendMessageToBrowserProcess.argsForCall[0][1][0]).toBe "C2"
|
|
|
|
atom.sendMessageToBrowserProcess.simulateConfirmation('Next')
|
|
|
|
|
|
|
|
expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
|
|
|
|
expect(atom.sendMessageToBrowserProcess.argsForCall[0][1][0]).toBe "B2"
|
|
|
|
atom.sendMessageToBrowserProcess.simulateConfirmation('Next')
|
|
|
|
|
|
|
|
expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
|
|
|
|
expect(atom.sendMessageToBrowserProcess.argsForCall[0][1][0]).toBe "A2"
|
|
|
|
atom.sendMessageToBrowserProcess.simulateConfirmation('Next')
|