1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
VimState = require '../lib/vim-state'
GlobalVimState = require '../lib/global-vim-state'
VimMode = require '../lib/vim-mode'
StatusBarManager = require '../lib/status-bar-manager'
[globalVimState, statusBarManager] = []
beforeEach ->
atom.workspace ||= {}
statusBarManager = null
globalVimState = null
spyOn(atom, 'beep')
getEditorElement = (callback) ->
textEditor = null
waitsForPromise ->
atom.project.open().then (e) ->
textEditor = e
runs ->
element = document.createElement("atom-text-editor")
element.setModel(textEditor)
element.classList.add('vim-mode')
statusBarManager ?= new StatusBarManager
globalVimState ?= new GlobalVimState
element.vimState = new VimState(element, statusBarManager, globalVimState)
element.addEventListener "keydown", (e) ->
atom.keymaps.handleKeyboardEvent(e)
# mock parent element for the text editor
document.createElement('html').appendChild(atom.views.getView(textEditor))
callback(element)
mockPlatform = (editorElement, platform) ->
wrapper = document.createElement('div')
wrapper.className = platform
wrapper.appendChild(editorElement)
unmockPlatform = (editorElement) ->
editorElement.parentNode.removeChild(editorElement)
dispatchKeyboardEvent = (target, eventArgs...) ->
e = document.createEvent('KeyboardEvent')
e.initKeyboardEvent(eventArgs...)
# 0 is the default, and it's valid ASCII, but it's wrong.
Object.defineProperty(e, 'keyCode', get: -> undefined) if e.keyCode is 0
target.dispatchEvent e
dispatchTextEvent = (target, eventArgs...) ->
e = document.createEvent('TextEvent')
e.initTextEvent(eventArgs...)
target.dispatchEvent e
keydown = (key, {element, ctrl, shift, alt, meta, raw}={}) ->
key = "U+#{key.charCodeAt(0).toString(16)}" unless key is 'escape' or raw?
element ||= document.activeElement
eventArgs = [
true, # bubbles
true, # cancelable
null, # view
key, # key
0, # location
ctrl, alt, shift, meta
]
canceled = not dispatchKeyboardEvent(element, 'keydown', eventArgs...)
dispatchKeyboardEvent(element, 'keypress', eventArgs...)
if not canceled
if dispatchTextEvent(element, 'textInput', eventArgs...)
element.value += key
dispatchKeyboardEvent(element, 'keyup', eventArgs...)
module.exports = {keydown, getEditorElement, mockPlatform, unmockPlatform}
|