import unittest
from aiva.monitoring import workload_analyzer

class TestWorkloadAnalyzer(unittest.TestCase):

    def test_calculate_moving_average_valid_data(self):
        data = [1, 2, 3, 4, 5, 6]
        window_size = 3
        expected_result = [2.0, 3.0, 4.0, 5.0]
        self.assertEqual(workload_analyzer.calculate_moving_average(data, window_size), expected_result)

    def test_calculate_moving_average_empty_data(self):
        data = []
        window_size = 3
        expected_result = []
        self.assertEqual(workload_analyzer.calculate_moving_average(data, window_size), expected_result)

    def test_calculate_moving_average_window_size_larger_than_data(self):
        data = [1, 2, 3]
        window_size = 4
        expected_result = []
        self.assertEqual(workload_analyzer.calculate_moving_average(data, window_size), expected_result)

    def test_calculate_moving_average_window_size_one(self):
        data = [1, 2, 3, 4, 5]
        window_size = 1
        expected_result = [1.0, 2.0, 3.0, 4.0, 5.0]
        self.assertEqual(workload_analyzer.calculate_moving_average(data, window_size), data)

    def test_collect_disk_io(self):
        disk_io_data = workload_analyzer.collect_disk_io(interval=0.1)
        self.assertEqual(len(disk_io_data), 10)
        for value in disk_io_data:
            self.assertIsInstance(value, int)
            self.assertGreaterEqual(value, 0)

    def test_cpu_ma(self):
        cpu_data = [10, 20, 30, 40, 50]
        window_size = 3
        expected_result = [20.0, 30.0, 40.0]
        self.assertEqual(workload_analyzer.calculate_moving_average(cpu_data, window_size), expected_result)

    def test_memory_ma(self):
        mem_data = [5, 10, 15, 20, 25]
        window_size = 3
        expected_result = [10.0, 15.0, 20.0]
        self.assertEqual(workload_analyzer.calculate_moving_average(mem_data, window_size), expected_result)

    def test_disk_io_ma(self):
        disk_data = [100, 200, 300, 400, 500]
        window_size = 3
        expected_result = [200.0, 300.0, 400.0]
        self.assertEqual(workload_analyzer.calculate_moving_average(disk_data, window_size), expected_result)

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