import unittest

import core.theme
import core.event

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' }
            ]
        }

    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.fg())
        self.assertEqual(self.defaultsTheme['defaults']['bg'], theme.bg())

    def test_cycle(self):
        theme = core.theme.Theme(raw_data=self.cycleTheme)
        self.assertEqual(None, theme.bg('previous'))
        self.assertEqual(self.cycleTheme['cycle'][0]['fg'], theme.fg())
        self.assertEqual(self.cycleTheme['cycle'][0]['bg'], theme.bg())
        core.event.trigger('next-widget')
        self.assertEqual(self.cycleTheme['cycle'][0]['bg'], theme.bg('previous'))
        core.event.trigger('next-widget')
        self.assertEqual(self.cycleTheme['cycle'][2]['fg'], theme.fg())
        self.assertEqual(self.cycleTheme['cycle'][2]['bg'], theme.bg())
       
        with unittest.mock.patch('core.output.sys.stdout'):
            core.event.trigger('update')
            self.assertEqual(self.cycleTheme['cycle'][0]['fg'], theme.fg())
            self.assertEqual(self.cycleTheme['cycle'][0]['bg'], theme.bg())

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