mirror of
https://github.com/atom/atom.git
synced 2026-01-25 23:08:18 -05:00
When we actually want to attach the root view in window-bootstrap.coffee, we call `window.attachRootView(path)` instead of calling `window.startup(path)`. Having `startup` called automatically means we can be sure any code we add there runs in every environment (including benchmark and specs). This is where we do things like setup the global keymap, parse text mate bundles and themes, and establish the window close handler. Any globals other than the root view that we want to be available in all environments should be established here. Right now that's just the keymap, but soon I want to add a global pasteboard.
181 lines
5.5 KiB
CoffeeScript
181 lines
5.5 KiB
CoffeeScript
nakedLoad 'jasmine-jquery'
|
|
$ = require 'jquery'
|
|
_ = require 'underscore'
|
|
Keymap = require 'keymap'
|
|
Point = require 'point'
|
|
Project = require 'project'
|
|
Directory = require 'directory'
|
|
File = require 'file'
|
|
RootView = require 'root-view'
|
|
TextMateBundle = require 'text-mate-bundle'
|
|
TextMateTheme = require 'text-mate-theme'
|
|
fs = require 'fs'
|
|
require 'window'
|
|
atom.showDevTools()
|
|
|
|
requireStylesheet "jasmine.css"
|
|
|
|
defaultTitle = document.title
|
|
pathsWithSubscriptions = null
|
|
|
|
beforeEach ->
|
|
atom.focus()
|
|
window.fixturesProject = new Project(require.resolve('fixtures'))
|
|
window.resetTimeouts()
|
|
pathsWithSubscriptions = []
|
|
|
|
afterEach ->
|
|
delete window.rootView if window.rootView
|
|
$('#jasmine-content').empty()
|
|
document.title = defaultTitle
|
|
ensureNoPathSubscriptions()
|
|
window.fixturesProject.destroy()
|
|
|
|
window.keymap.bindKeys '*', 'meta-w': 'close'
|
|
$(document).on 'close', -> window.close()
|
|
|
|
# Don't load user configuration in specs, because it's variable
|
|
RootView.prototype.loadUserConfiguration = ->
|
|
|
|
for klass in [Directory, File]
|
|
klass.prototype.originalOn = klass.prototype.on
|
|
klass.prototype.on = (args...) ->
|
|
pathsWithSubscriptions.push(this) if @subscriptionCount() == 0
|
|
@originalOn(args...)
|
|
|
|
ensureNoPathSubscriptions = ->
|
|
totalSubscriptionCount = 0
|
|
for path in pathsWithSubscriptions
|
|
totalSubscriptionCount += path.subscriptionCount()
|
|
console.log "Non-zero subscription count on", path if path.subscriptionCount() > 0
|
|
|
|
if totalSubscriptionCount > 0
|
|
throw new Error("Total path subscription count was #{totalSubscriptionCount}, when it should have been 0.\nSee console for details.")
|
|
|
|
# Use underscore's definition of equality for toEqual assertions
|
|
jasmine.Env.prototype.equals_ = _.isEqual
|
|
|
|
emitObject = jasmine.StringPrettyPrinter.prototype.emitObject
|
|
jasmine.StringPrettyPrinter.prototype.emitObject = (obj) ->
|
|
if obj.inspect
|
|
@append obj.inspect()
|
|
else
|
|
emitObject.call(this, obj)
|
|
|
|
window.keyIdentifierForKey = (key) ->
|
|
if key.length > 1 # named key
|
|
key
|
|
else
|
|
charCode = key.toUpperCase().charCodeAt(0)
|
|
"U+00" + charCode.toString(16)
|
|
|
|
window.keydownEvent = (key, properties={}) ->
|
|
event = $.Event "keydown", _.extend({originalEvent: { keyIdentifier: keyIdentifierForKey(key) }}, properties)
|
|
# event.keystroke = (new Keymap).keystrokeStringForEvent(event)
|
|
event
|
|
|
|
window.mouseEvent = (type, properties) ->
|
|
if properties.point
|
|
{point, editor} = properties
|
|
{top, left} = @pagePixelPositionForPoint(editor, point)
|
|
properties.pageX = left + 1
|
|
properties.pageY = top + 1
|
|
properties.originalEvent ?= {detail: 1}
|
|
$.Event type, properties
|
|
|
|
window.clickEvent = (properties={}) ->
|
|
window.mouseEvent("click", properties)
|
|
|
|
window.mousedownEvent = (properties={}) ->
|
|
window.mouseEvent('mousedown', properties)
|
|
|
|
window.mousemoveEvent = (properties={}) ->
|
|
window.mouseEvent('mousemove', properties)
|
|
|
|
window.waitsForPromise = (args...) ->
|
|
if args.length > 1
|
|
{ shouldReject } = args[0]
|
|
else
|
|
shouldReject = false
|
|
fn = _.last(args)
|
|
|
|
window.waitsFor (moveOn) ->
|
|
promise = fn()
|
|
if shouldReject
|
|
promise.fail(moveOn)
|
|
promise.done ->
|
|
jasmine.getEnv().currentSpec.fail("Expected promise to be rejected, but it was resolved")
|
|
moveOn()
|
|
else
|
|
promise.done(moveOn)
|
|
promise.fail (error) ->
|
|
jasmine.getEnv().currentSpec.fail("Expected promise to be resolved, but it was rejected with #{jasmine.pp(error)}")
|
|
moveOn()
|
|
|
|
window.resetTimeouts = ->
|
|
window.now = 0
|
|
window.timeoutCount = 0
|
|
window.timeouts = []
|
|
|
|
window.originalSetTimeout = window.setTimeout
|
|
window.setTimeout = (callback, ms) ->
|
|
id = ++window.timeoutCount
|
|
window.timeouts.push([id, window.now + ms, callback])
|
|
id
|
|
|
|
window.clearTimeout = (idToClear) ->
|
|
window.timeouts = window.timeouts.filter ([id]) -> id != idToClear
|
|
|
|
window.advanceClock = (delta=1) ->
|
|
window.now += delta
|
|
window.timeouts = window.timeouts.filter ([id, strikeTime, callback]) ->
|
|
if strikeTime <= window.now
|
|
callback()
|
|
false
|
|
else
|
|
true
|
|
|
|
window.pagePixelPositionForPoint = (editor, point) ->
|
|
point = Point.fromObject point
|
|
top = editor.renderedLines.offset().top + point.row * editor.lineHeight
|
|
left = editor.renderedLines.offset().left + point.column * editor.charWidth - editor.renderedLines.scrollLeft()
|
|
{ top, left }
|
|
|
|
window.tokensText = (tokens) ->
|
|
_.pluck(tokens, 'value').join('')
|
|
|
|
window.setEditorWidthInChars = (editor, widthInChars, charWidth=editor.charWidth) ->
|
|
editor.width(charWidth * widthInChars + editor.gutter.outerWidth())
|
|
$(window).trigger 'resize' # update width of editor's on-screen lines
|
|
|
|
window.setEditorHeightInLines = (editor, heightInChars, charHeight=editor.lineHeight) ->
|
|
editor.height(charHeight * heightInChars + editor.renderedLines.position().top)
|
|
$(window).trigger 'resize' # update editor's on-screen lines
|
|
|
|
$.fn.resultOfTrigger = (type) ->
|
|
event = $.Event(type)
|
|
this.trigger(event)
|
|
event.result
|
|
|
|
$.fn.enableKeymap = ->
|
|
@on 'keydown', (e) => window.keymap.handleKeyEvent(e)
|
|
|
|
$.fn.attachToDom = ->
|
|
$('#jasmine-content').append(this)
|
|
|
|
$.fn.simulateDomAttachment = ->
|
|
$('<html>').append(this)
|
|
|
|
$.fn.textInput = (data) ->
|
|
this.each ->
|
|
event = document.createEvent('TextEvent')
|
|
event.initTextEvent('textInput', true, true, window, data)
|
|
event = jQuery.event.fix(event)
|
|
$(this).trigger(event)
|
|
|
|
$.fn.simulateDomAttachment = ->
|
|
$('<html>').append(this)
|
|
|
|
unless fs.md5ForPath(require.resolve('fixtures/sample.js')) == "dd38087d0d7e3e4802a6d3f9b9745f2b"
|
|
throw "Sample.js is modified"
|