TestIntentManager.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. from unittest.mock import MagicMock, patch
  2. import pytest
  3. from typing import Any, Dict, List
  4. from cura.Settings.IntentManager import IntentManager
  5. from cura.Machines.QualityGroup import QualityGroup
  6. from cura.Machines.QualityManager import QualityManager
  7. from tests.Settings.MockContainer import MockContainer
  8. @pytest.fixture()
  9. def quality_manager(application, container_registry, global_stack) -> QualityManager:
  10. application.getGlobalContainerStack = MagicMock(return_value = global_stack)
  11. with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value = application)):
  12. with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)):
  13. manager = QualityManager(application)
  14. return manager
  15. @pytest.fixture()
  16. def intent_manager(application, extruder_manager, machine_manager, quality_manager, container_registry, global_stack) -> IntentManager:
  17. application.getExtruderManager = MagicMock(return_value = extruder_manager)
  18. application.getGlobalContainerStack = MagicMock(return_value = global_stack)
  19. application.getMachineManager = MagicMock(return_value = machine_manager)
  20. application.getQualityManager = MagicMock(return_value = quality_manager)
  21. with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value = application)):
  22. with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)):
  23. manager = IntentManager()
  24. return manager
  25. mocked_intent_metadata = [
  26. {"id": "um3_aa4_pla_smooth_normal", "GUID": "abcxyz", "definition": "ultimaker3", "variant": "AA 0.4",
  27. "material_id": "generic_pla", "intent_category": "smooth", "quality_type": "normal"},
  28. {"id": "um3_aa4_pla_strong_abnorm", "GUID": "defqrs", "definition": "ultimaker3", "variant": "AA 0.4",
  29. "material_id": "generic_pla", "intent_category": "strong", "quality_type": "abnorm"}] # type:List[Dict[str, str]]
  30. mocked_qualitygroup_metadata = {
  31. "normal": QualityGroup("um3_aa4_pla_normal", "normal"),
  32. "abnorm": QualityGroup("um3_aa4_pla_abnorm", "abnorm")} # type:Dict[str, QualityGroup]
  33. def mockFindMetadata(**kwargs) -> List[Dict[str, Any]]:
  34. if "id" in kwargs:
  35. return [x for x in mocked_intent_metadata if x["id"] == kwargs["id"]]
  36. else:
  37. result = []
  38. for data in mocked_intent_metadata:
  39. should_add = True
  40. for key, value in kwargs.items():
  41. if key in data.keys():
  42. should_add &= (data[key] == value)
  43. if should_add:
  44. result.append(data)
  45. return result
  46. def mockFindContainers(**kwargs) -> List[MockContainer]:
  47. result = []
  48. metadatas = mockFindMetadata(**kwargs)
  49. for metadata in metadatas:
  50. result.append(MockContainer(metadata))
  51. return result
  52. def doSetup(application, extruder_manager, quality_manager, container_registry, global_stack) -> None:
  53. container_registry.findContainersMetadata = MagicMock(side_effect = mockFindMetadata)
  54. container_registry.findContainers = MagicMock(side_effect = mockFindContainers)
  55. quality_manager.getQualityGroups = MagicMock(return_value = mocked_qualitygroup_metadata)
  56. for _, qualitygroup in mocked_qualitygroup_metadata.items():
  57. qualitygroup.node_for_global = MagicMock(name = "Node for global")
  58. application.getQualityManager = MagicMock(return_value = quality_manager)
  59. global_stack.definition = MockContainer({"id": "ultimaker3"})
  60. application.getGlobalContainerStack = MagicMock(return_value = global_stack)
  61. extruder_stack_a = MockContainer({"id": "Extruder The First"})
  62. extruder_stack_a.variant = MockContainer({"name": "AA 0.4"})
  63. extruder_stack_a.material = MockContainer({"base_file": "generic_pla"})
  64. extruder_stack_b = MockContainer({"id": "Extruder II: Plastic Boogaloo"})
  65. extruder_stack_b.variant = MockContainer({"name": "AA 0.4"})
  66. extruder_stack_b.material = MockContainer({"base_file": "generic_pla"})
  67. application.getGlobalContainerStack().extruderList = [extruder_stack_a, extruder_stack_b]
  68. extruder_manager.getUsedExtruderStacks = MagicMock(return_value = [extruder_stack_a, extruder_stack_b])
  69. def test_intentCategories(application, intent_manager, container_registry):
  70. # Mock .findContainersMetadata so we also test .intentMetadatas (the latter is mostly a wrapper around the former).
  71. container_registry.findContainersMetadata = MagicMock(return_value = mocked_intent_metadata)
  72. with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value = application)):
  73. with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)):
  74. categories = intent_manager.intentCategories("ultimaker3", "AA 0.4", "generic_pla") # type:List[str]
  75. assert "default" in categories, "default should always be in categories"
  76. assert "strong" in categories, "strong should be in categories"
  77. assert "smooth" in categories, "smooth should be in categories"
  78. def test_getCurrentAvailableIntents(application, extruder_manager, quality_manager, intent_manager, container_registry, global_stack):
  79. doSetup(application, extruder_manager, quality_manager, container_registry, global_stack)
  80. with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value = application)):
  81. with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)):
  82. intents = intent_manager.getCurrentAvailableIntents()
  83. assert ("smooth", "normal") in intents
  84. assert ("strong", "abnorm") in intents
  85. #assert ("default", "normal") in intents # Pending to-do in 'IntentManager'.
  86. #assert ("default", "abnorm") in intents # Pending to-do in 'IntentManager'.
  87. assert len(intents) == 2 # Or 4? pending to-do in 'IntentManager'.
  88. def test_currentAvailableIntentCategories(application, extruder_manager, quality_manager, intent_manager, container_registry, global_stack):
  89. doSetup(application, extruder_manager, quality_manager, container_registry, global_stack)
  90. with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)):
  91. with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
  92. with patch("cura.Settings.ExtruderManager.ExtruderManager.getInstance", MagicMock(return_value=extruder_manager)):
  93. categories = intent_manager.currentAvailableIntentCategories()
  94. assert "default" in categories # Currently inconsistent with 'currentAvailableIntents'!
  95. assert "smooth" in categories
  96. assert "strong" in categories
  97. assert len(categories) == 3
  98. def test_selectIntent(application, extruder_manager, quality_manager, intent_manager, container_registry, global_stack):
  99. doSetup(application, extruder_manager, quality_manager, container_registry, global_stack)
  100. with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)):
  101. with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
  102. with patch("cura.Settings.ExtruderManager.ExtruderManager.getInstance", MagicMock(return_value=extruder_manager)):
  103. intents = intent_manager.getCurrentAvailableIntents()
  104. for intent, quality in intents:
  105. intent_manager.selectIntent(intent, quality)
  106. extruder_stacks = extruder_manager.getUsedExtruderStacks()
  107. assert len(extruder_stacks) == 2
  108. assert extruder_stacks[0].intent.getMetaDataEntry("intent_category") == intent
  109. assert extruder_stacks[1].intent.getMetaDataEntry("intent_category") == intent