import autopath
from httpmp2.framestate import FrameState
from httpmp2.clientevent import ClientEvent

class TestFrameState(object):
    def test_basic_key_state(self):
        s = FrameState()
        assert not s.keysdown

        s.process_event(ClientEvent('KD1'))
        assert s.keysdown.keys() == ['1']

        s.process_event(ClientEvent('KD2'))
        assert s.keysdown.keys() == ['1', '2']

        s.process_event(ClientEvent('KU1'))
        assert s.keysdown.keys() == ['2']

        # should be kind of solid
        s.process_event(ClientEvent('KD2'))
        assert s.keysdown.keys() == ['2']

        s.process_event(ClientEvent('KU1'))
        assert s.keysdown.keys() == ['2']
        
    def test_basic_mouse_state(self):
        # XXX not even sure if mouse click handling is that useful, since
        # mouse movement is ignored too... (would be too much events to handle)
        s = FrameState()
        assert not s.mouse1down
        assert s.mouse1clicks == 0

        s.process_event(ClientEvent('MD1'))
        assert s.mouse1down
        assert s.mouse1clicks == 1
        
        s.process_event(ClientEvent('MU1'))
        assert not s.mouse1down
        assert s.mouse1clicks == 1

        s.process_event(ClientEvent('MD1'))
        assert s.mouse1down
        assert s.mouse1clicks == 2
        
        # should be kind of solid
        s.process_event(ClientEvent('MD1'))
        assert s.mouse1down
        assert s.mouse1clicks == 3

        s.process_event(ClientEvent('MU1'))
        assert not s.mouse1down
        s.process_event(ClientEvent('MU1'))
        assert not s.mouse1down
        assert s.mouse1clicks == 3

    def test_previous(self):
        s1 = FrameState()
        s1.process_event(ClientEvent('MD1'))
        s1.process_event(ClientEvent('MU1'))
        s1.process_event(ClientEvent('MD1'))
        s1.process_event(ClientEvent('KD128'))

        s2 = FrameState(s1)
        assert s2.mouse1down
        assert s2.mouse1clicks == 2
        assert s2.keysdown.keys() == ['128']


