Coverage for test/unit/tasks/__init__.py: 92%

39 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-03-12 17:09 +0000

1import tempfile 

2import unittest 

3from typing import Union 

4from unittest import mock 

5 

6from bim2sim.kernel.decision.decisionhandler import DebugDecisionHandler 

7from bim2sim.sim_settings import BaseSimSettings 

8from bim2sim.tasks.base import ITask 

9from test.unit.elements.helper import SetupHelper 

10 

11 

12class TestTask(unittest.TestCase): 

13 """Base class for all task-related tests. 

14 

15 Provides common setup and teardown functionality including: 

16 - Mock playground, project, and paths 

17 - Temporary export directory 

18 - Settings management 

19 - Helper reset 

20 

21 To use this, please overwrite the abstract class methods 

22 simSettingsClass(), testTask() and helper() in your own test class. 

23 """ 

24 

25 @classmethod 

26 def setUpClass(cls) -> None: 

27 """Set up infrastructure that remains constant for all test methods.""" 

28 if cls is TestTask: 

29 raise unittest.SkipTest("Skip TestTask tests, it's a base class") 

30 

31 # Set up playground, project and paths via mocks 

32 cls.playground = mock.Mock() 

33 project = mock.Mock() 

34 paths = mock.Mock() 

35 cls.playground.project = project 

36 cls.playground.sim_settings = cls.simSettingsClass() 

37 

38 cls.test_task = cls.testTask() 

39 cls.test_task.paths = paths 

40 cls.export_path = tempfile.TemporaryDirectory(prefix='bim2sim') 

41 cls.test_task.paths.export = cls.export_path.name 

42 

43 # Setup helper 

44 cls.helper = cls.helper() 

45 

46 def setUp(self) -> None: 

47 """Set up infrastructure that needs to be fresh for each test.""" 

48 # Set up temporary export directory 

49 self.test_task.prj_name = f'TestTask{self.__class__.__name__}' 

50 

51 def tearDown(self) -> None: 

52 """Clean up after each test method.""" 

53 self.helper.reset() 

54 self.playground.sim_settings.load_default_settings() 

55 

56 def run_task(self, answers, reads): 

57 return DebugDecisionHandler(answers).handle(self.test_task.run(*reads)) 

58 

59 @classmethod 

60 def simSettingsClass(cls) -> Union[BaseSimSettings, None]: 

61 return None 

62 

63 @classmethod 

64 def testTask(cls) -> Union[ITask, None]: 

65 return None 

66 

67 @classmethod 

68 def helper(cls) -> Union[SetupHelper, None]: 

69 return None