cloudcmd/lib/client/console/test/prompt-test.coffee
2014-02-11 06:33:00 -05:00

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