import Input from require 'input'
import vec2 from require 'cpml'
describe "Input", ->
input = Input!
it "sane initial state", ->
assert.is_equal vec2!, input\mouse_delta!
assert.is_falsy input\mouse_down!
assert.is_falsy input\mouse_up!
assert.is_falsy input\mouse_held!
assert.is_equal 'hover', input\mouse_event!
assert.is_falsy input\key_down 'w'
assert.is_falsy input\key_up 'w'
assert.is_falsy input\key_held 'w'
assert.is_falsy input\key_event 'w'
it "processes input events", ->
input\mousemoved 0, 0
input\frame!
input\mousemoved 20, 20
input\keypressed 'w'
input\keypressed 'a'
input\mousepressed 21, 21, 1
input\mousepressed 21, 21, 2
it "updates accordingly", ->
assert.is_equal (vec2 20, 20), input.mouse
assert.is_equal (vec2 20, 20), input\mouse_pos!
assert.is_equal (vec2 20, 20), input\mouse_delta!
assert.is_true input\mouse_down!
assert.is_true input\mouse_held!
assert.is_falsy input\mouse_up!
assert.is_equal 'down', input\mouse_event!
assert.is_true input\mouse_down 2
assert.is_true input\mouse_held 2
assert.is_falsy input\mouse_up 2
assert.is_equal 'down', input\mouse_event 2
assert.is_true input\key_down 'w'
assert.is_true input\key_held 'w'
assert.is_falsy input\key_up 'w'
assert.is_equal 'down', input\key_event 'w'
it "keep state after end-of-frame", ->
input\frame!
assert.is_equal (vec2 20, 20), input.mouse
assert.is_equal (vec2 20, 20), input\mouse_pos!
assert.is_equal vec2!, input\mouse_delta!
assert.is_true input\mouse_held!
assert.is_falsy input\mouse_down!
assert.is_falsy input\mouse_up!
assert.is_equal 'held', input\mouse_event!
assert.is_true input\mouse_held 2
assert.is_falsy input\mouse_down 2
assert.is_falsy input\mouse_up 2
assert.is_equal 'held', input\mouse_event 2
assert.is_true input\key_held 'w'
assert.is_falsy input\key_down 'w'
assert.is_falsy input\key_up 'w'
assert.is_equal 'held', input\key_event 'w'
it "keeps updating", ->
input\keyreleased 'a'
input\mousereleased 21, 21, 2
input\mousemoved 0, 40
assert.is_equal (vec2 0, 40), input.mouse
assert.is_equal (vec2 0, 40), input\mouse_pos!
assert.is_equal (vec2 -20, 20), input\mouse_delta!
assert.is_true input\mouse_held!
assert.is_falsy input\mouse_down!
assert.is_falsy input\mouse_up!
assert.is_equal 'held', input\mouse_event!
assert.is_true input\mouse_up 2
assert.is_falsy input\mouse_held 2
assert.is_falsy input\mouse_down 2
assert.is_equal 'up', input\mouse_event 2
assert.is_true input\key_held 'w'
assert.is_falsy input\key_down 'w'
assert.is_falsy input\key_up 'w'
assert.is_equal 'held', input\key_event 'w'
assert.is_true input\key_up 'a'
assert.is_falsy input\key_held 'a'
assert.is_falsy input\key_down 'a'
assert.is_equal 'up', input\key_event 'a'
it "allows capturing the keyboard", ->
input\text_capture!
assert.has_error -> input\text_capture!
input\textinput 'Helloo'
input\keypressed 'backspace'
assert.is_falsy input\key_down 'backspace'
input\frame!
assert.is_equal 'Hello', input.text
input\textinput ' World'
assert.is_equal 'Hello World', input.text
assert.is_falsy input\key_down 'backspace'
it "doesn't capture meta-keys (return and escape)", ->
input\keypressed 'return'
input\keypressed 'escape'
assert.is_true input\key_down 'return'
assert.is_true input\key_down 'escape'
it "returns the input' text after releasing the keyboard", ->
assert.is_equal 'Hello World', input\text_release!
input\keypressed 'backspace'
assert.is_true input\key_down 'backspace'