mirror of
https://github.com/coderaiser/cloudcmd.git
synced 2026-07-18 17:05:17 +00:00
400 lines
12 KiB
CoffeeScript
400 lines
12 KiB
CoffeeScript
{jqconsole, createScroll, typer: {typeA, keyDown, type}} = jqconsoleSetup()
|
|
|
|
describe 'Prompt Interaction', ->
|
|
describe '#Prompt', ->
|
|
after ->
|
|
jqconsole.AbortPrompt()
|
|
|
|
it 'inits prompt and auto-focuses', ->
|
|
counter = 0
|
|
jqconsole.$input_source.focus ->
|
|
counter++
|
|
resultCb = ->
|
|
jqconsole.Prompt true, resultCb
|
|
equal jqconsole.GetState(), 'prompt'
|
|
ok counter
|
|
ok jqconsole.history_active
|
|
strictEqual jqconsole.input_callback, resultCb
|
|
equal jqconsole.$prompt.text().trim(), 'prompt_label'
|
|
|
|
describe '#AbortPrompt', ->
|
|
it 'aborts the prompt', ->
|
|
jqconsole.Prompt true, ->
|
|
jqconsole.AbortPrompt()
|
|
equal jqconsole.$prompt.text().trim(), ''
|
|
|
|
it 'restarts queued prompts', ->
|
|
aCb = ->
|
|
jqconsole.Prompt false, aCb
|
|
bCb = ->
|
|
jqconsole.Prompt true, bCb
|
|
strictEqual jqconsole.input_callback, aCb
|
|
strictEqual jqconsole.history_active, false
|
|
jqconsole.AbortPrompt()
|
|
strictEqual jqconsole.input_callback, bCb
|
|
strictEqual jqconsole.history_active, true
|
|
jqconsole.AbortPrompt()
|
|
|
|
describe '#GetPromptText', ->
|
|
beforeEach -> jqconsole.Prompt true, ->
|
|
afterEach -> jqconsole.AbortPrompt()
|
|
|
|
it 'gets the current prompt text', ->
|
|
type 'foo'
|
|
equal jqconsole.$prompt.text().trim(), 'prompt_labelfoo'
|
|
equal jqconsole.GetPromptText(), 'foo'
|
|
|
|
it 'gets the current prompt text with the label', ->
|
|
type 'foo'
|
|
equal jqconsole.$prompt.text().trim(), 'prompt_labelfoo'
|
|
equal jqconsole.GetPromptText(true), 'prompt_labelfoo'
|
|
|
|
describe '#ClearPromptText', ->
|
|
beforeEach -> jqconsole.Prompt true, ->
|
|
afterEach -> jqconsole.AbortPrompt()
|
|
|
|
it 'Clears the current prompt text', ->
|
|
type 'foo'
|
|
equal jqconsole.GetPromptText(), 'foo'
|
|
jqconsole.ClearPromptText()
|
|
equal jqconsole.GetPromptText(), ''
|
|
|
|
it 'Clears prompt text with label', ->
|
|
type 'foo'
|
|
equal jqconsole.GetPromptText(), 'foo'
|
|
jqconsole.ClearPromptText true
|
|
equal jqconsole.GetPromptText(true), ''
|
|
|
|
describe '#SetPromptText', ->
|
|
beforeEach -> jqconsole.Prompt true, ->
|
|
afterEach -> jqconsole.AbortPrompt()
|
|
|
|
it 'sets the current prompt text', ->
|
|
type 'bar'
|
|
jqconsole.SetPromptText('foo')
|
|
equal jqconsole.GetPromptText(), 'foo'
|
|
|
|
describe 'Moving', ->
|
|
beforeEach -> jqconsole.Prompt true, ->
|
|
afterEach -> jqconsole.AbortPrompt()
|
|
|
|
it 'moves to the left', ->
|
|
type 'xyz'
|
|
keyDown 37
|
|
equal jqconsole.$prompt_left.text().trim(), 'xy'
|
|
keyDown 37
|
|
equal jqconsole.$prompt_left.text().trim(), 'x'
|
|
keyDown 37
|
|
equal jqconsole.$prompt_left.text().trim(), ''
|
|
keyDown 37
|
|
equal jqconsole.$prompt_left.text().trim(), ''
|
|
|
|
it 'moves to the right', ->
|
|
type 'xyz'
|
|
keyDown 37
|
|
keyDown 37
|
|
equal jqconsole.$prompt_left.text().trim(), 'x'
|
|
keyDown 39
|
|
equal jqconsole.$prompt_left.text().trim(), 'xy'
|
|
keyDown 39
|
|
equal jqconsole.$prompt_left.text().trim(), 'xyz'
|
|
keyDown 39
|
|
equal jqconsole.$prompt_left.text().trim(), 'xyz'
|
|
|
|
it 'moves to the prev line when at the first char of the line moving left', ->
|
|
type 'xyz'
|
|
keyDown 13, shiftKey: on
|
|
type 'abc'
|
|
equal jqconsole.$prompt_left.text().trim(), 'abc'
|
|
keyDown 37
|
|
keyDown 37
|
|
keyDown 37
|
|
keyDown 37
|
|
equal jqconsole.$prompt_left.text().trim(), 'xyz'
|
|
|
|
it 'moves to the next line when at the last char of the line moving right', ->
|
|
type 'xyz'
|
|
keyDown 13, shiftKey: on
|
|
type 'abc'
|
|
equal jqconsole.$prompt_left.text().trim(), 'abc'
|
|
keyDown 37
|
|
keyDown 37
|
|
keyDown 37
|
|
keyDown 37
|
|
equal jqconsole.$prompt_left.text().trim(), 'xyz'
|
|
keyDown 39
|
|
equal jqconsole.$prompt_right.text().trim(), 'abc'
|
|
|
|
it 'moves to the start of the word', ->
|
|
type 'xyz abc'
|
|
keyDown 37, metaKey: on
|
|
equal jqconsole.$prompt_right.text().trim(), 'abc'
|
|
equal jqconsole.$prompt_left.text().trim(), 'xyz'
|
|
|
|
it 'moves to the end of the word', ->
|
|
type 'xyz abc'
|
|
keyDown 37, metaKey: on
|
|
keyDown 37, metaKey: on
|
|
keyDown 39, metaKey: on
|
|
equal jqconsole.$prompt_right.text().trim(), 'abc'
|
|
equal jqconsole.$prompt_left.text().trim(), 'xyz'
|
|
|
|
it 'moves to the end of the word', ->
|
|
type 'xyz abc'
|
|
keyDown 37, metaKey: on
|
|
keyDown 37, metaKey: on
|
|
keyDown 39, metaKey: on
|
|
equal jqconsole.$prompt_right.text().trim(), 'abc'
|
|
equal jqconsole.$prompt_left.text().trim(), 'xyz'
|
|
|
|
it 'moves to the start of the line', ->
|
|
type 'xyz abc'
|
|
keyDown 36
|
|
equal jqconsole.$prompt_right.text().trim(), 'xyz abc'
|
|
|
|
it 'moves to the end of the line', ->
|
|
type 'xyz abc'
|
|
keyDown 36
|
|
equal jqconsole.$prompt_right.text().trim(), 'xyz abc'
|
|
keyDown 35
|
|
equal jqconsole.$prompt_right.text().trim(), ''
|
|
equal jqconsole.$prompt_left.text().trim(), 'xyz abc'
|
|
|
|
it 'moves to the start of the prompt', ->
|
|
type 'xyz abc'
|
|
keyDown 13, shiftKey: on
|
|
type 'hafm olim'
|
|
keyDown 36, metaKey: on
|
|
equal jqconsole.$prompt_right.text().trim(), 'xyz abc'
|
|
equal jqconsole.$prompt_after.text().trim(), 'prompt_continuehafm olim'
|
|
|
|
it 'moves to the end of the prompt', ->
|
|
type 'xyz abc'
|
|
keyDown 13, shiftKey: on
|
|
type 'hafm olim'
|
|
keyDown 36, metaKey: on
|
|
equal jqconsole.$prompt_right.text().trim(), 'xyz abc'
|
|
equal jqconsole.$prompt_after.text().trim(), 'prompt_continuehafm olim'
|
|
keyDown 35, metaKey: on
|
|
equal jqconsole.$prompt_left.text().trim(), 'hafm olim'
|
|
equal jqconsole.$prompt_before.text().trim(), 'prompt_labelxyz abc'
|
|
|
|
it 'moves up one line', ->
|
|
type 'xyz'
|
|
keyDown 13, shiftKey: on
|
|
type 'a'
|
|
keyDown 38, shiftKey: on
|
|
equal jqconsole.$prompt_right.text().trim(), 'yz'
|
|
|
|
it 'moves down one line', ->
|
|
type 'xyz'
|
|
keyDown 13, shiftKey: on
|
|
type 'a'
|
|
# Meta key also works.
|
|
keyDown 38, metaKey: on
|
|
equal jqconsole.$prompt_right.text().trim(), 'yz'
|
|
keyDown 40, metaKey: on
|
|
equal jqconsole.$prompt_right.text().trim(), ''
|
|
|
|
it 'respects the column when moving vertically', ->
|
|
type 'xyz'
|
|
keyDown 13, shiftKey: on
|
|
type 'ab'
|
|
keyDown 38, shiftKey: on
|
|
equal jqconsole.$prompt_right.text().trim(), 'z'
|
|
keyDown 40, shiftKey: on
|
|
keyDown 37
|
|
keyDown 37
|
|
equal jqconsole.$prompt_right.text().trim(), 'ab'
|
|
keyDown 38, shiftKey: on
|
|
equal jqconsole.$prompt_right.text().trim(), 'xyz'
|
|
|
|
describe 'Control Keys', ->
|
|
beforeEach -> jqconsole.Prompt true, ->
|
|
afterEach -> jqconsole.AbortPrompt()
|
|
|
|
it 'handles enter', ->
|
|
jqconsole.AbortPrompt()
|
|
counter = 0
|
|
jqconsole.Prompt true, -> counter++
|
|
typeA()
|
|
keyDown 13
|
|
ok counter
|
|
equal jqconsole.$console.find('.jqconsole-old-prompt').last().text().trim(), 'prompt_labela'
|
|
# Restart the prompt for other tests.
|
|
jqconsole.Prompt true, ->
|
|
|
|
it 'handles shift+enter', ->
|
|
keyDown 13, shiftKey: on
|
|
equal jqconsole.$prompt.text().trim(), 'prompt_label \nprompt_continue'
|
|
|
|
it 'handles tab', ->
|
|
typeA()
|
|
keyDown 9
|
|
equal jqconsole.$prompt.text().trim(), 'prompt_label a'
|
|
|
|
it 'handles shift+tab', ->
|
|
typeA()
|
|
keyDown 9, shiftKey: on
|
|
equal jqconsole.$prompt.text().trim(), 'prompt_labela'
|
|
|
|
it 'backspace', ->
|
|
typeA()
|
|
keyDown 8
|
|
equal jqconsole.$prompt.text().trim(), 'prompt_label'
|
|
|
|
it 'cntrl+backspace', ->
|
|
typeA()
|
|
typeA()
|
|
keyDown 8, metaKey: on
|
|
equal jqconsole.$prompt.text().trim(), 'prompt_label'
|
|
|
|
it 'deletes a char', ->
|
|
type 'xyz'
|
|
keyDown 37
|
|
equal jqconsole.$prompt_right.text().trim(), 'z'
|
|
keyDown 46
|
|
equal jqconsole.$prompt_right.text().trim(), ''
|
|
|
|
it 'deletes a word', ->
|
|
type 'xyz abc'
|
|
keyDown 37
|
|
keyDown 37
|
|
keyDown 37
|
|
equal jqconsole.$prompt_right.text().trim(), 'abc'
|
|
keyDown 46, metaKey: on
|
|
equal jqconsole.$prompt_right.text().trim(), ''
|
|
|
|
describe 'scrolling', ->
|
|
console_height = null
|
|
_fast = null
|
|
|
|
before ->
|
|
jQuery.fx.speeds.fast = 10
|
|
after ->
|
|
jQuery.fx.speeds.fast = _fast
|
|
|
|
beforeEach ->
|
|
jqconsole.Reset()
|
|
jqconsole.Prompt true, ->
|
|
# Make sure the console has a scroll.
|
|
{ console_height } = createScroll()
|
|
|
|
it 'scrolls up', (done) ->
|
|
before = jqconsole.$container[0].scrollTop
|
|
keyDown 33
|
|
cb = ->
|
|
equal jqconsole.$container[0].scrollTop, before - console_height
|
|
done()
|
|
# * 2 is some arbitrary number otherwise it fails.
|
|
setTimeout cb, jQuery.fx.speeds.fast * 2
|
|
|
|
it 'scrolls up twice', (done) ->
|
|
before = jqconsole.$container[0].scrollTop
|
|
keyDown 33
|
|
cb = ->
|
|
keyDown 33
|
|
cb = ->
|
|
equal jqconsole.$container[0].scrollTop, before - (console_height * 2)
|
|
done()
|
|
setTimeout cb, jQuery.fx.speeds.fast * 2
|
|
# * 2 is some arbitrary number otherwise it fails.
|
|
setTimeout cb, jQuery.fx.speeds.fast * 2
|
|
|
|
it 'scrolls down', (done) ->
|
|
before = jqconsole.$container[0].scrollTop
|
|
keyDown 33
|
|
cb = ->
|
|
keyDown 34
|
|
cb = ->
|
|
equal jqconsole.$container[0].scrollTop, before
|
|
done()
|
|
setTimeout cb, jQuery.fx.speeds.fast * 2
|
|
# * 2 is some arbitrary number otherwise it fails.
|
|
setTimeout cb, jQuery.fx.speeds.fast * 2
|
|
|
|
describe 'Typing', ->
|
|
beforeEach -> jqconsole.Prompt true, ->
|
|
afterEach -> jqconsole.AbortPrompt()
|
|
|
|
it 'handles chars', ->
|
|
str = ''
|
|
test = (ch) ->
|
|
str += ch
|
|
e = $.Event('keypress')
|
|
e.which = ch.charCodeAt(0)
|
|
jqconsole.$input_source.trigger e
|
|
equal jqconsole.$prompt.text().trim(), 'prompt_label' + str
|
|
|
|
test 'a'
|
|
test 'Z'
|
|
test '$'
|
|
test 'ƒ'
|
|
|
|
it 'scrolls all the way down when typing', (done) ->
|
|
createScroll()
|
|
keyDown 33
|
|
cb = ->
|
|
before = jqconsole.$container[0].scrollTop
|
|
type('a')
|
|
cb = ->
|
|
notEqual jqconsole.$container[0].scrollTop, before
|
|
done()
|
|
setTimeout cb, 0
|
|
setTimeout cb, jQuery.fx.speeds.fast * 2
|
|
|
|
describe 'Multiline', ->
|
|
beforeEach ->
|
|
if jqconsole.GetState() is 'prompt'
|
|
jqconsole.AbortPrompt()
|
|
|
|
it 'executes multiline callback', (done) ->
|
|
jqconsole.Prompt true, (-> ), ->
|
|
done()
|
|
type('foo')
|
|
keyDown 13
|
|
|
|
it 'indents', ->
|
|
jqconsole.Prompt true, (-> ), ->
|
|
return 2
|
|
type('foo')
|
|
keyDown 13
|
|
equal jqconsole.GetState(), 'prompt'
|
|
equal jqconsole.GetPromptText(), 'foo\n '
|
|
|
|
it 'keeps indentation on shift+enter', ->
|
|
jqconsole.Prompt true, (-> ), ->
|
|
return 2
|
|
type('foo')
|
|
keyDown 9
|
|
keyDown 13, shiftKey: on
|
|
equal jqconsole.GetState(), 'prompt'
|
|
equal jqconsole.GetPromptText(), ' foo\n '
|
|
|
|
it 'unindents', ->
|
|
jqconsole.Prompt true, (-> ), ->
|
|
return -2
|
|
type('foo')
|
|
keyDown 9
|
|
keyDown 13
|
|
equal jqconsole.GetPromptText(), ' foo\n'
|
|
|
|
it 'skip indent callback', (done) ->
|
|
jqconsole.Prompt true, done.bind(null, null), ->
|
|
return false
|
|
type('foo')
|
|
keyDown 13
|
|
|
|
it 'handles async treatment', (done) ->
|
|
jqconsole.Prompt true, done.bind(null, null), ((text, cb) -> cb false), on
|
|
type('foo')
|
|
keyDown 13
|
|
|
|
describe '#Input', ->
|
|
it 'should enable history', (done) ->
|
|
jqconsole.Prompt true, done.bind(null, null)
|
|
jqconsole.Input (text) ->
|
|
assert.equal text, 'foo'
|
|
setTimeout (-> keyDown(13)), 0
|
|
type 'foo'
|
|
keyDown 13
|