new_contents: # pylint: disable=C0103,C0111
  
  import json
  import mock
  import unittest
  
  import mocks
  
  from bumblebee.input import I3BarInput, LEFT_MOUSE, RIGHT_MOUSE
  
  class TestI3BarInput(unittest.TestCase):
      def setUp(self):
          self.input = I3BarInput()
          self.input.need_event = True
  
          self._stdin = mock.patch("bumblebee.input.sys.stdin")
          self.stdin = self._stdin.start()
          self._select = mock.patch("bumblebee.input.select")
          self.select = self._select.start()
          self.popen = mocks.MockPopen()
  
          self.stdin.fileno.return_value = 1
          epoll = mock.Mock()
          self.select.epoll.return_value = epoll
  
          epoll.poll.return_value = [(self.stdin.fileno.return_value, 2)]
  
          self.anyModule = mocks.MockModule()
          self.anotherModule = mocks.MockModule()
          self.anyWidget = mocks.MockWidget("some-widget")
          self.anotherWidget = mocks.MockWidget("another-widget")
          self.anyData = self.invalidData = "any data"
          self.invalidEvent = json.dumps({"name": None, "instance": None, "button": 1})
          self.incompleteEvent = json.dumps({"button": 1})
          self.anyCommand = "this is a command with arguments"
  
          self._called = 0
  
      def tearDown(self):
          self._stdin.stop()
          self._select.stop()
          self.popen.cleanup()
  
      def callback(self, event):
          self._called += 1
  
      def calls(self):
          rv = self._called
          self._called = 0
          return rv
  
      def test_read_event(self):
          self.stdin.readline.return_value = self.anyData
          self.input.start()
          self.input.stop()
          self.stdin.readline.assert_any_call()
  
      def test_ignore_invalid_input(self):
          for data in [ self.invalidData, self.incompleteEvent, self.invalidEvent ]:
              self.stdin.readline.return_value = data
              self.input.start()
              self.assertEquals(self.input.alive(), True)
              self.assertEquals(self.input.stop(), True)
              self.stdin.readline.assert_any_call()
  
      def test_global_callback(self):
          self.input.register_callback(None, button=LEFT_MOUSE, cmd=self.callback)
          mocks.mouseEvent(button=LEFT_MOUSE, inp=self.input, stdin=self.stdin)
          self.assertTrue(self.calls() > 0)
  
      def test_remove_global_callback(self):
          self.test_global_callback()
          self.input.deregister_callbacks(None)
          mocks.mouseEvent(button=LEFT_MOUSE, inp=self.input, stdin=self.stdin)
          self.assertTrue(self.calls() == 0)
  
      def test_global_callback_wrong_button(self):
          self.input.register_callback(None, button=LEFT_MOUSE, cmd=self.callback)
          mocks.mouseEvent(button=RIGHT_MOUSE, inp=self.input, stdin=self.stdin)
          self.assertTrue(self.calls() == 0)
  
      def test_module_callback(self):
          self.input.register_callback(self.anyModule, button=LEFT_MOUSE, cmd=self.callback)
          mocks.mouseEvent(button=LEFT_MOUSE, inp=self.input, stdin=self.stdin, module=self.anyModule)
          self.assertTrue(self.calls() > 0)
          mocks.mouseEvent(button=LEFT_MOUSE, inp=self.input, stdin=self.stdin, module=self.anotherModule)
          self.assertTrue(self.calls() == 0)
  
      def test_remove_module_callback(self):
          self.test_module_callback()
          self.input.deregister_callbacks(self.anyModule)
          mocks.mouseEvent(button=LEFT_MOUSE, inp=self.input, stdin=self.stdin, module=self.anyModule)
          self.assertTrue(self.calls() == 0)
  
      def test_widget_callback(self):
          self.input.register_callback(self.anyWidget, button=LEFT_MOUSE, cmd=self.callback)
          mocks.mouseEvent(button=LEFT_MOUSE, inp=self.input, stdin=self.stdin, module=self.anyWidget)
          self.assertTrue(self.calls() > 0)
          mocks.mouseEvent(button=LEFT_MOUSE, inp=self.input, stdin=self.stdin, module=self.anotherWidget)
          self.assertTrue(self.calls() == 0)
  
      def test_widget_cmd_callback(self):
          self.input.register_callback(self.anyWidget, button=LEFT_MOUSE, cmd=self.anyCommand)
          mocks.mouseEvent(button=LEFT_MOUSE, inp=self.input, stdin=self.stdin, module=self.anyWidget)
          self.popen.assert_call(self.anyCommand)
  
  
  # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
  
subject: Add tests for i3bar input processing