# pylint: disable=C0103,C0111

import mock
import unittest
import importlib

import tests.mocks as mocks

from bumblebee.engine import all_modules
from bumblebee.output import Widget
from bumblebee.config import Config

class TestGenericModules(unittest.TestCase):
    def setUp(self):
        engine = mock.Mock()
        engine.input = mock.Mock()
        config = Config()
        self.objects = {}

        self.popen = mocks.MockPopen()
        self.popen.mock.communicate.return_value = (str.encode("1"), "error")
        self.popen.mock.returncode = 0

        self._platform = mock.patch("bumblebee.modules.kernel.platform")
        self.platform = self._platform.start()
        self.platform.release.return_value = "unknown linux v1"

        for mod in all_modules():
            name = "bumblebee.modules.{}".format(mod["name"])
            cls = importlib.import_module(name)
            self.objects[mod["name"]] = getattr(cls, "Module")(engine, {"config": config})
            for widget in self.objects[mod["name"]].widgets():
                self.assertEquals(widget.get("variable", None), None)

    def tearDown(self):
        self._platform.stop()
        self.popen.cleanup()

    def test_widgets(self):
        for mod in self.objects:
            widgets = self.objects[mod].widgets()
            for widget in widgets:
                widget.link_module(self.objects[mod])
                self.assertEquals(widget.module, mod)
                self.assertTrue(isinstance(widget, Widget))
                self.assertTrue(hasattr(widget, "full_text"))
                widget.set("variable", "value")
                self.assertEquals(widget.get("variable", None), "value")
                self.assertTrue(isinstance(widget.full_text(), str) or isinstance(widget.full_text(), unicode))

    def test_update(self):
        for mod in self.objects:
            widgets = self.objects[mod].widgets()
            self.objects[mod].update(widgets)
            self.test_widgets()
            self.assertEquals(widgets, self.objects[mod].widgets())

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