bumblebee-status/tests/core/test_theme.py
tobi-wan-kenobi 4cd6444bbf [core/theme] Improve items that are lists
Until now, using a list as prefix/suffix didn't work as expected,
because the corresponding method for retrieving the value was called
multiple times, and each time, the next icon would be retrieved.

Changed the logic inside the theme to only update the indices every time
that an actual update was happening.
2020-04-12 14:01:51 +02:00

126 lines
4.7 KiB
Python

import unittest
import types
import core.theme
import core.event
import core.widget
class theme(unittest.TestCase):
def setUp(self):
core.event.clear()
self.invalidThemeName = 'this-theme-does-not-exist'
self.validThemeName = 'default'
self.defaultsTheme = {
'defaults': {
'fg': 'red', 'bg': 'black'
}
}
self.cycleTheme = {
'cycle': [
{ 'fg': 'red', 'bg': 'black' },
{ 'fg': 'black', 'bg': 'red' },
{ 'fg': 'white', 'bg': 'blue' }
]
}
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' }
}
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):
theme = core.theme.Theme(raw_data=self.defaultsTheme)
self.assertEqual(self.defaultsTheme['defaults']['fg'], theme.get('fg'))
self.assertEqual(self.defaultsTheme['defaults']['bg'], theme.get('bg'))
def test_cycle(self):
theme = core.theme.Theme(raw_data=self.cycleTheme)
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('update')
self.assertEqual(self.cycleTheme['cycle'][0]['fg'], theme.get('fg'))
self.assertEqual(self.cycleTheme['cycle'][0]['bg'], theme.get('bg'))
def test_custom_iconset(self):
theme = core.theme.Theme(raw_data=self.defaultsTheme)
self.assertNotEqual('aaa', theme.get('padding'))
theme = core.theme.Theme(raw_data=self.defaultsTheme, iconset={
'defaults': { 'padding': 'aaa' }
})
self.assertEqual('aaa', theme.get('padding'))
def test_colors(self):
theme = core.theme.Theme(raw_data=self.defaultsTheme)
self.assertEqual({}, theme.keywords())
theme = core.theme.Theme(raw_data=self.colorTheme)
self.assertEqual(self.colorTheme['colors'][0], theme.keywords())
def test_wal_colors(self):
with unittest.mock.patch('core.theme.io') as io:
io.open.return_value.__enter__.return_value.read.return_value='''
{ "colors": { "red": "#ff0000" } }
'''
theme = core.theme.Theme(raw_data=self.walTheme)
self.assertEqual({'red': '#ff0000'}, theme.keywords())
def test_wal_special(self):
with unittest.mock.patch('core.theme.io') as io:
io.open.return_value.__enter__.return_value.read.return_value='''
{ "special": { "background": "#ff0000" } }
'''
theme = core.theme.Theme(raw_data=self.walTheme)
self.assertEqual({'background': '#ff0000'}, theme.keywords())
def test_cycle_value(self):
widget = core.widget.Widget()
expected = self.cycleValueTheme['defaults']['fg']
theme = core.theme.Theme(raw_data=self.cycleValueTheme)
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('update')
def test_state(self):
widget = core.widget.Widget()
theme = core.theme.Theme(raw_data=self.stateTheme)
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))
widget.state = types.MethodType(lambda self: ['critical'], widget)
self.assertEqual(self.stateTheme['critical']['fg'], theme.get('fg', widget))
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4