import unittest

import core.event


class event(unittest.TestCase):
    def setUp(self):
        self.someEvent = "event"
        self.called = {}
        self.params = []
        core.event.clear()

    def callback1(self):
        self.called["callback1"] = True

    def callback2(self):
        self.called["callback2"] = True

    def callback_args(self, val1, val2):
        self.called["callback_args"] = True
        self.params = [val1, val2]

    def callback_kwargs(self, val1, val2, key1=None, key2=None):
        self.called["callback_kwargs"] = True
        self.params = [val1, val2, key1, key2]

    def test_simple_callback(self):
        core.event.register(self.someEvent, self.callback1)
        core.event.register(self.someEvent, self.callback2)

        core.event.trigger(self.someEvent)

        self.assertEqual(2, len(self.called.keys()))

    def test_arg_callback(self):
        core.event.register(self.someEvent, self.callback_args, "a", "b")
        core.event.trigger(self.someEvent)
        self.assertEqual(1, len(self.called.keys()))
        self.assertEqual(["a", "b"], self.params)

    def test_kwargs_callback(self):
        core.event.register(
            self.someEvent, self.callback_kwargs, "a", "b", key1="test", key2="x"
        )
        core.event.trigger(self.someEvent)
        self.assertEqual(1, len(self.called.keys()))
        self.assertEqual(["a", "b", "test", "x"], self.params)

    def test_arg_trigger(self):
        core.event.register(self.someEvent, self.callback_args)
        core.event.trigger(self.someEvent, "a", "b")
        self.assertEqual(1, len(self.called.keys()))
        self.assertEqual(["a", "b"], self.params)

    def test_kwargs_trigger(self):
        core.event.register(self.someEvent, self.callback_kwargs)
        core.event.trigger(self.someEvent, "a", "b", key1="test", key2="x")
        self.assertEqual(1, len(self.called.keys()))
        self.assertEqual(["a", "b", "test", "x"], self.params)


# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4