import unittest
import unittest.mock
import time

# Assuming aiva/power_management.py exists and contains the PowerManagement class
# with methods like adjust_cpu_scaling, dim_display, adjust_network_polling
from aiva import power_management

class TestPowerManagement(unittest.TestCase):

    def setUp(self):
        self.power_manager = power_management.PowerManagement()
        self.initial_cpu_scaling = self.power_manager.cpu_scaling
        self.initial_display_brightness = self.power_manager.display_brightness
        self.initial_network_polling_interval = self.power_manager.network_polling_interval

    def tearDown(self):
        # Restore initial values after each test
        self.power_manager.cpu_scaling = self.initial_cpu_scaling
        self.power_manager.display_brightness = self.initial_display_brightness
        self.power_manager.network_polling_interval = self.initial_network_polling_interval

    def test_adjust_cpu_scaling_idle(self):
        # Test CPU scaling when entering idle state
        self.power_manager.enter_idle_state()
        self.assertLessEqual(self.power_manager.cpu_scaling, self.initial_cpu_scaling)

    def test_adjust_cpu_scaling_active(self):
        # Test CPU scaling when exiting idle state (user interaction)
        self.power_manager.enter_idle_state()
        self.power_manager.exit_idle_state()
        self.assertEqual(self.power_manager.cpu_scaling, self.initial_cpu_scaling)

    def test_dim_display_idle(self):
        # Test display dimming when entering idle state
        self.power_manager.enter_idle_state()
        self.assertLessEqual(self.power_manager.display_brightness, self.initial_display_brightness)

    def test_dim_display_active(self):
        # Test display brightness when exiting idle state (user interaction)
        self.power_manager.enter_idle_state()
        self.power_manager.exit_idle_state()
        self.assertEqual(self.power_manager.display_brightness, self.initial_display_brightness)

    def test_adjust_network_polling_interval_idle(self):
        # Test network polling interval adjustment when entering idle state
        self.power_manager.enter_idle_state()
        self.assertGreaterEqual(self.power_manager.network_polling_interval, self.initial_network_polling_interval)

    def test_adjust_network_polling_interval_active(self):
        # Test network polling interval adjustment when exiting idle state (user interaction)
        self.power_manager.enter_idle_state()
        self.power_manager.exit_idle_state()
        self.assertEqual(self.power_manager.network_polling_interval, self.initial_network_polling_interval)

    @unittest.mock.patch('time.sleep', return_value=None)
    def test_idle_state_duration(self, mock_sleep):
        # Test that the system remains in idle state for a specified duration
        idle_duration = 5  # seconds
        self.power_manager.enter_idle_state(idle_duration)
        mock_sleep.assert_called_with(idle_duration)

    def test_invalid_brightness_level(self):
        # Test that setting an invalid brightness level raises an exception or is handled correctly.
        with self.assertRaises(ValueError):
            self.power_manager.display_brightness = 150  # Assuming 150 is an invalid value

    def test_negative_polling_interval(self):
          with self.assertRaises(ValueError):
            self.power_manager.network_polling_interval = -10

if __name__ == '__main__':
    unittest.main()
