2020-02-15 14:05:27 +01:00
|
|
|
import unittest
|
2020-04-04 08:03:03 +02:00
|
|
|
import types
|
2020-02-15 14:05:27 +01:00
|
|
|
|
|
|
|
import core.theme
|
2020-02-22 13:42:44 +01:00
|
|
|
import core.event
|
2020-04-04 08:03:03 +02:00
|
|
|
import core.widget
|
2020-06-04 20:56:31 +02:00
|
|
|
import core.module
|
|
|
|
|
|
|
|
|
|
|
|
class TestModule(core.module.Module):
|
|
|
|
def __init__(self, widgets, config=core.config.Config([]), theme=None):
|
|
|
|
super().__init__(config, theme, widgets)
|
|
|
|
self.name = "test"
|
2020-02-15 14:05:27 +01:00
|
|
|
|
2020-05-03 11:15:52 +02:00
|
|
|
|
2020-02-15 14:05:27 +01:00
|
|
|
class theme(unittest.TestCase):
|
|
|
|
def setUp(self):
|
2020-02-22 13:42:44 +01:00
|
|
|
core.event.clear()
|
2020-05-03 11:15:52 +02:00
|
|
|
self.invalidThemeName = "this-theme-does-not-exist"
|
|
|
|
self.validThemeName = "default"
|
|
|
|
self.defaultsTheme = {"defaults": {"fg": "red", "bg": "black"}}
|
2020-02-16 14:02:21 +01:00
|
|
|
self.cycleTheme = {
|
2020-05-03 11:15:52 +02:00
|
|
|
"cycle": [
|
|
|
|
{"fg": "red", "bg": "black"},
|
|
|
|
{"fg": "black", "bg": "red"},
|
|
|
|
{"fg": "white", "bg": "blue"},
|
2020-02-16 14:02:21 +01:00
|
|
|
]
|
|
|
|
}
|
2020-05-03 11:15:52 +02:00
|
|
|
self.colorTheme = {"colors": [{"red": "#ff0000", "blue": "#0000ff"}]}
|
|
|
|
self.walTheme = {"colors": ["wal"]}
|
|
|
|
self.cycleValueTheme = {"defaults": {"fg": ["red", "green", "blue"]}}
|
|
|
|
self.stateTheme = {"warning": {"fg": "yellow"}, "critical": {"fg": "red"}}
|
2020-06-04 20:56:31 +02:00
|
|
|
self.overlayTheme = {
|
|
|
|
"load": {"prefix": "a"},
|
|
|
|
"test": {"load": {"prefix": "b"}, "prefix": "x"},
|
|
|
|
}
|
2020-02-15 14:05:27 +01:00
|
|
|
|
|
|
|
def test_invalid_theme(self):
|
|
|
|
with self.assertRaises(RuntimeError):
|
|
|
|
core.theme.Theme(self.invalidThemeName)
|
|
|
|
|
|
|
|
def test_valid_theme(self):
|
|
|
|
theme = core.theme.Theme(self.validThemeName)
|
|
|
|
self.assertEqual(self.validThemeName, theme.name)
|
|
|
|
|
|
|
|
def test_defaults(self):
|
2020-02-16 14:02:21 +01:00
|
|
|
theme = core.theme.Theme(raw_data=self.defaultsTheme)
|
2020-05-03 11:15:52 +02:00
|
|
|
self.assertEqual(self.defaultsTheme["defaults"]["fg"], theme.get("fg"))
|
|
|
|
self.assertEqual(self.defaultsTheme["defaults"]["bg"], theme.get("bg"))
|
2020-02-16 14:02:21 +01:00
|
|
|
|
|
|
|
def test_cycle(self):
|
|
|
|
theme = core.theme.Theme(raw_data=self.cycleTheme)
|
2020-05-03 11:15:52 +02:00
|
|
|
self.assertEqual(None, theme.get("prev-bg"))
|
|
|
|
self.assertEqual(self.cycleTheme["cycle"][0]["fg"], theme.get("fg"))
|
|
|
|
self.assertEqual(self.cycleTheme["cycle"][0]["bg"], theme.get("bg"))
|
|
|
|
core.event.trigger("next-widget")
|
|
|
|
self.assertEqual(self.cycleTheme["cycle"][0]["bg"], theme.get("bg", "previous"))
|
|
|
|
core.event.trigger("next-widget")
|
|
|
|
self.assertEqual(self.cycleTheme["cycle"][2]["fg"], theme.get("fg"))
|
|
|
|
self.assertEqual(self.cycleTheme["cycle"][2]["bg"], theme.get("bg"))
|
|
|
|
|
|
|
|
with unittest.mock.patch("core.output.sys.stdout"):
|
|
|
|
core.event.trigger("draw")
|
|
|
|
self.assertEqual(self.cycleTheme["cycle"][0]["fg"], theme.get("fg"))
|
|
|
|
self.assertEqual(self.cycleTheme["cycle"][0]["bg"], theme.get("bg"))
|
2020-02-15 14:05:27 +01:00
|
|
|
|
2020-03-28 14:03:50 +01:00
|
|
|
def test_custom_iconset(self):
|
|
|
|
theme = core.theme.Theme(raw_data=self.defaultsTheme)
|
2020-05-03 11:15:52 +02:00
|
|
|
self.assertNotEqual("aaa", theme.get("padding"))
|
|
|
|
theme = core.theme.Theme(
|
|
|
|
raw_data=self.defaultsTheme, iconset={"defaults": {"padding": "aaa"}}
|
|
|
|
)
|
|
|
|
self.assertEqual("aaa", theme.get("padding"))
|
2020-03-28 14:03:50 +01:00
|
|
|
|
|
|
|
def test_colors(self):
|
|
|
|
theme = core.theme.Theme(raw_data=self.defaultsTheme)
|
|
|
|
self.assertEqual({}, theme.keywords())
|
|
|
|
theme = core.theme.Theme(raw_data=self.colorTheme)
|
2020-05-03 11:15:52 +02:00
|
|
|
self.assertEqual(self.colorTheme["colors"][0], theme.keywords())
|
2020-03-28 14:03:50 +01:00
|
|
|
|
2020-03-28 14:51:48 +01:00
|
|
|
def test_wal_colors(self):
|
2020-05-03 11:15:52 +02:00
|
|
|
with unittest.mock.patch("core.theme.io") as io:
|
|
|
|
with unittest.mock.patch("core.theme.os") as os:
|
2020-04-13 13:47:50 +02:00
|
|
|
os.path.isfile.return_value = True
|
|
|
|
io.open.return_value = unittest.mock.MagicMock()
|
2020-05-03 11:15:52 +02:00
|
|
|
io.open.return_value.__enter__.return_value.read.return_value = """
|
2020-04-13 13:47:50 +02:00
|
|
|
{ "colors": { "red": "#ff0000" } }
|
2020-05-03 11:15:52 +02:00
|
|
|
"""
|
2020-03-28 14:51:48 +01:00
|
|
|
|
2020-04-13 13:47:50 +02:00
|
|
|
theme = core.theme.Theme(raw_data=self.walTheme)
|
2020-05-03 11:15:52 +02:00
|
|
|
self.assertEqual({"red": "#ff0000"}, theme.keywords())
|
2020-03-28 14:51:48 +01:00
|
|
|
|
|
|
|
def test_wal_special(self):
|
2020-05-03 11:15:52 +02:00
|
|
|
with unittest.mock.patch("core.theme.io") as io:
|
|
|
|
with unittest.mock.patch("core.theme.os") as os:
|
2020-04-13 13:47:50 +02:00
|
|
|
os.path.isfile.return_value = True
|
2020-05-03 11:15:52 +02:00
|
|
|
io.open.return_value.__enter__.return_value.read.return_value = """
|
2020-04-13 13:47:50 +02:00
|
|
|
{ "special": { "background": "#ff0000" } }
|
2020-05-03 11:15:52 +02:00
|
|
|
"""
|
2020-03-28 14:51:48 +01:00
|
|
|
|
2020-04-13 13:47:50 +02:00
|
|
|
theme = core.theme.Theme(raw_data=self.walTheme)
|
2020-05-03 11:15:52 +02:00
|
|
|
self.assertEqual({"background": "#ff0000"}, theme.keywords())
|
2020-03-28 14:51:48 +01:00
|
|
|
|
2020-04-04 08:03:03 +02:00
|
|
|
def test_cycle_value(self):
|
|
|
|
widget = core.widget.Widget()
|
2020-05-03 11:15:52 +02:00
|
|
|
expected = self.cycleValueTheme["defaults"]["fg"]
|
2020-04-04 08:03:03 +02:00
|
|
|
theme = core.theme.Theme(raw_data=self.cycleValueTheme)
|
|
|
|
|
2020-05-03 11:15:52 +02:00
|
|
|
for i in range(0, len(expected) * 3):
|
|
|
|
self.assertEqual(expected[i % len(expected)], theme.get("fg", widget))
|
|
|
|
self.assertEqual(
|
|
|
|
expected[i % len(expected)], theme.get("fg", widget)
|
|
|
|
) # ensure multiple invocations are OK
|
|
|
|
core.event.trigger("draw")
|
2020-04-04 08:03:03 +02:00
|
|
|
|
|
|
|
def test_state(self):
|
|
|
|
widget = core.widget.Widget()
|
|
|
|
theme = core.theme.Theme(raw_data=self.stateTheme)
|
|
|
|
|
2020-05-03 11:15:52 +02:00
|
|
|
self.assertEqual(None, theme.get("fg", widget))
|
|
|
|
|
|
|
|
widget.state = types.MethodType(lambda self: ["warning"], widget)
|
|
|
|
self.assertEqual(self.stateTheme["warning"]["fg"], theme.get("fg", widget))
|
2020-04-04 08:03:03 +02:00
|
|
|
|
2020-05-03 11:15:52 +02:00
|
|
|
widget.state = types.MethodType(lambda self: ["critical"], widget)
|
|
|
|
self.assertEqual(self.stateTheme["critical"]["fg"], theme.get("fg", widget))
|
2020-04-04 08:03:03 +02:00
|
|
|
|
2020-06-04 20:56:31 +02:00
|
|
|
def test_overlay(self):
|
|
|
|
widget = core.widget.Widget()
|
|
|
|
module = TestModule(widget)
|
|
|
|
theme = core.theme.Theme(raw_data=self.overlayTheme)
|
|
|
|
|
|
|
|
self.assertEqual(
|
|
|
|
self.overlayTheme[module.name]["prefix"], theme.get("prefix", widget)
|
|
|
|
)
|
|
|
|
|
|
|
|
widget.state = types.MethodType(lambda self: ["load"], widget)
|
|
|
|
|
|
|
|
self.assertEqual(
|
|
|
|
self.overlayTheme[module.name]["load"]["prefix"],
|
|
|
|
theme.get("prefix", widget),
|
|
|
|
)
|
|
|
|
|
2020-04-04 08:03:03 +02:00
|
|
|
|
2020-02-15 14:05:27 +01:00
|
|
|
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
|