diff --git a/cura/Settings/IntentManager.py b/cura/Settings/IntentManager.py index c3fb41a0de..a5d71a918d 100644 --- a/cura/Settings/IntentManager.py +++ b/cura/Settings/IntentManager.py @@ -1,13 +1,10 @@ #Copyright (c) 2019 Ultimaker B.V. #Cura is released under the terms of the LGPLv3 or higher. -from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal +from PyQt5.QtCore import QObject, pyqtSignal from typing import Any, Dict, List, Set, Tuple, TYPE_CHECKING from cura.CuraApplication import CuraApplication -from cura.Machines.QualityManager import QualityManager from cura.Settings.ExtruderManager import ExtruderManager -from cura.Settings.MachineManager import MachineManager -from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.InstanceContainer import InstanceContainer if TYPE_CHECKING: @@ -75,7 +72,8 @@ class IntentManager(QObject): if global_stack is None: return [("default", "normal")] quality_groups = application.getQualityManager().getQualityGroups(global_stack) - available_quality_types = {quality_group.quality_type for quality_group in quality_groups if quality_group.node_for_global is not None} + available_quality_types = {quality_group.quality_type for quality_group in quality_groups.values() if quality_group.node_for_global is not None} + # available_quality_types could just be 'quality_group.keys()', except for that the node_for_global may be None final_intent_ids = set() #type: Set[str] current_definition_id = global_stack.definition.getMetaDataEntry("id") diff --git a/tests/TestIntentManager.py b/tests/TestIntentManager.py index 01f8cb310b..8b6a88b3b8 100644 --- a/tests/TestIntentManager.py +++ b/tests/TestIntentManager.py @@ -1,24 +1,45 @@ from unittest.mock import MagicMock, patch import pytest +from typing import Any, Dict, List from cura.Settings.IntentManager import IntentManager +from cura.Machines.QualityGroup import QualityGroup +from cura.Machines.QualityManager import QualityManager + +from tests.Settings.MockContainer import MockContainer @pytest.fixture() -def intent_manager(application, extruder_manager, machine_manager, container_registry, global_stack) -> IntentManager: +def quality_manager(application, container_registry, global_stack) -> QualityManager: + application.getGlobalContainerStack = MagicMock(return_value = global_stack) + with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)): + with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)): + manager = QualityManager(application) + return manager + + +@pytest.fixture() +def intent_manager(application, extruder_manager, machine_manager, quality_manager, container_registry, global_stack) -> IntentManager: application.getExtruderManager = MagicMock(return_value = extruder_manager) application.getGlobalContainerStack = MagicMock(return_value = global_stack) application.getMachineManager = MagicMock(return_value = machine_manager) + application.getQualityManager = MagicMock(return_value = quality_manager) with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)): with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)): manager = IntentManager() - return manager + +mocked_intent_metadata = [ + {"id": "um3_aa4_pla_smooth_normal", "GUID": "abcxyz", "definition": "ultimaker3", "variant": "AA 0.4", + "material_id": "generic_pla", "intent_category": "smooth", "quality_type": "normal"}, + {"id": "um3_aa4_pla_strong_abnorm", "GUID": "defqrs", "definition": "ultimaker3", "variant": "AA 0.4", + "material_id": "generic_pla", "intent_category": "strong", "quality_type": "abnorm"}] # type:List[Dict[str, str]] + + def test_intentCategories(application, intent_manager, container_registry): - mocked_metadata = [{"id": "um3_aa4_pla_smooth", "GUID": "abcxyz", "definition": "ultimaker3", "variant": "AA 0.4", "material_id": "generic_pla", "intent_category": "smooth"}, - {"id": "um3_aa4_pla_strong", "GUID": "defqrs", "definition": "ultimaker3", "variant": "AA 0.4", "material_id": "generic_pla", "intent_category": "strong"}] - container_registry.findContainersMetadata = MagicMock(return_value=mocked_metadata) + # Mock .findContainersMetadata so we also test .intentMetadatas (the latter is mostly a wrapper around the former). + container_registry.findContainersMetadata = MagicMock(return_value=mocked_intent_metadata) with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)): with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)): @@ -26,3 +47,50 @@ def test_intentCategories(application, intent_manager, container_registry): assert "default" in categories, "default should always be in categories" assert "strong" in categories, "strong should be in categories" assert "smooth" in categories, "smooth should be in categories" + + +def test_currentAvailableIntents(application, extruder_manager, quality_manager, intent_manager, container_registry): + mocked_qualitygroup_metadata = { + "normal": QualityGroup("um3_aa4_pla_normal", "normal"), + "abnorm": QualityGroup("um3_aa4_pla_abnorm", "abnorm")} # type:Dict[str, QualityGroup] + + def mockIntentMetadatas(**kwargs) -> List[Dict[str, Any]]: + if "id" in kwargs: + return [x for x in mocked_intent_metadata if x["id"] == kwargs["id"]] + else: + # TODO? switch on 'kwargs["definition_id"]', "nozzle_name", "material_id" -> ... or go 1 deeper + return mocked_intent_metadata + container_registry.findContainersMetadata = MagicMock(side_effect=mockIntentMetadatas) + + quality_manager.getQualityGroups = MagicMock(return_value=mocked_qualitygroup_metadata) + for _, qualitygroup in mocked_qualitygroup_metadata.items(): + qualitygroup.node_for_global = MagicMock(name="Node for global") + application.getQualityManager = MagicMock(return_value=quality_manager) + + extruder_stack_a = MockContainer({"id": "A"}) + extruder_stack_a.variant = MockContainer({"id": "A_variant"}) + extruder_stack_a.material = MockContainer({"id": "A_material"}) + extruder_stack_b = MockContainer({"id": "B"}) + extruder_stack_b.variant = MockContainer({"id": "B_variant"}) + extruder_stack_b.material = MockContainer({"id": "B_material"}) + # See previous TODO, the above doesn't really matter if intentmetadatas is mocked out the way it is, but it should. + + extruder_manager.getUsedExtruderStacks = MagicMock(return_value=[extruder_stack_a, extruder_stack_b]) + + with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)): + with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)): + with patch("cura.Settings.ExtruderManager.ExtruderManager.getInstance", MagicMock(return_value=extruder_manager)): + intents = intent_manager.currentAvailableIntents() + assert ("smooth", "normal") in intents + assert ("strong", "abnorm") in intents + assert len(intents) == 2 + + +def test_currentAvailableIntentCategories(application, quality_manager, intent_manager, container_registry): + # def currentAvailableIntentCategories(self) -> List[str]: + pass + + +def test_selectIntent(application, intent_manager, container_registry): + # def selectIntent(self, intent_category, quality_type) -> None: + pass