import unittest from unittest.mock import patch import sys import os # Add the src/controllerSoftware directory to the Python path sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src/controllerSoftware'))) from vision import VisionSystem, DeepStreamBackend, PythonBackend class TestVisionSystem(unittest.TestCase): """ Unit tests for the VisionSystem class. """ def setUp(self): """ Set up a VisionSystem instance with a mocked backend for each test. """ self.config = {"camera_id": 0, "model_path": "yolov10.onnx"} @patch('platform.system') @patch('vision.DeepStreamBackend') def test_initialization_linux(self, mock_backend, mock_system): """ Test that the VisionSystem initializes the DeepStreamBackend on Linux. """ mock_system.return_value = 'Linux' vision_system = VisionSystem(self.config) mock_backend.assert_called_once_with(self.config) @patch('platform.system') @patch('vision.DeepStreamBackend') def test_initialization_windows(self, mock_backend, mock_system): """ Test that the VisionSystem initializes the DeepStreamBackend on Windows. """ mock_system.return_value = 'Windows' vision_system = VisionSystem(self.config) mock_backend.assert_called_once_with(self.config) @patch('platform.system') @patch('vision.PythonBackend') def test_initialization_macos(self, mock_backend, mock_system): """ Test that the VisionSystem initializes the PythonBackend on macOS. """ mock_system.return_value = 'Darwin' vision_system = VisionSystem(self.config) mock_backend.assert_called_once_with(self.config) @patch('platform.system') def test_initialization_unsupported(self, mock_system): """ Test that the VisionSystem raises an exception on an unsupported OS. """ mock_system.return_value = 'UnsupportedOS' with self.assertRaises(NotImplementedError): VisionSystem(self.config) @patch('platform.system') @patch('vision.DeepStreamBackend') def test_start(self, mock_backend, mock_system): """ Test that the start method calls the backend's start method. """ mock_system.return_value = 'Linux' vision_system = VisionSystem(self.config) vision_system.start() vision_system._backend.start.assert_called_once() @patch('platform.system') @patch('vision.DeepStreamBackend') def test_stop(self, mock_backend, mock_system): """ Test that the stop method calls the backend's stop method. """ mock_system.return_value = 'Linux' vision_system = VisionSystem(self.config) vision_system.stop() vision_system._backend.stop.assert_called_once() @patch('platform.system') @patch('vision.DeepStreamBackend') def test_get_pupil_data(self, mock_backend, mock_system): """ Test that the get_pupil_data method calls the backend's get_pupil_data method. """ mock_system.return_value = 'Linux' vision_system = VisionSystem(self.config) vision_system.get_pupil_data() vision_system._backend.get_pupil_data.assert_called_once() if __name__ == '__main__': unittest.main()