mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-04-21 13:19:37 +08:00

Very rudimentary at the moment, need to split the method into 3, and make a class for the setup. This also uncovered that the currentAvailableIntents doesn't (unless the global stack is missing) retrun any default intents, while currentAvailableIntentCategories does do that. Since it's not clear how we're going to handle that right now, I made a TODO in the code, which of course will have to be fixed before this/these branch/es are merged. part of CURA-6091
112 lines
6.2 KiB
Python
112 lines
6.2 KiB
Python
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 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):
|
|
# 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)):
|
|
categories = intent_manager.intentCategories("ultimaker3", "AA 0.4", "generic_pla") # type:List[str]
|
|
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, global_stack):
|
|
# This also tests 'currentAvailableIntentCategories' and 'selectIntent' since the methods are so similar
|
|
|
|
mocked_qualitygroup_metadata = {
|
|
"normal": QualityGroup("um3_aa4_pla_normal", "normal"),
|
|
"abnorm": QualityGroup("um3_aa4_pla_abnorm", "abnorm")} # type:Dict[str, QualityGroup]
|
|
|
|
def mockFindMetadata(**kwargs) -> List[Dict[str, Any]]:
|
|
if "id" in kwargs:
|
|
return [x for x in mocked_intent_metadata if x["id"] == kwargs["id"]]
|
|
else:
|
|
result = []
|
|
for data in mocked_intent_metadata:
|
|
should_add = True
|
|
for key, value in kwargs.items():
|
|
should_add &= (data[key] == value)
|
|
if should_add:
|
|
result.append(data)
|
|
return result
|
|
container_registry.findContainersMetadata = MagicMock(side_effect=mockFindMetadata)
|
|
|
|
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)
|
|
|
|
global_stack.definition = MockContainer({"id": "ultimaker3"})
|
|
application.getGlobalContainerStack = MagicMock(return_value=global_stack)
|
|
|
|
extruder_stack_a = MockContainer({"id": "Extruder The First"})
|
|
extruder_stack_a.variant = MockContainer({"name": "AA 0.4"})
|
|
extruder_stack_a.material = MockContainer({"base_file": "generic_pla"})
|
|
extruder_stack_b = MockContainer({"id": "Extruder II: Plastic Boogaloo"})
|
|
extruder_stack_b.variant = MockContainer({"name": "AA 0.4"})
|
|
extruder_stack_b.material = MockContainer({"base_file": "generic_pla"})
|
|
|
|
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 ("default", "normal") in intents # Pending to-do in 'IntentManager'.
|
|
#assert ("default", "abnorm") in intents # Pending to-do in 'IntentManager'.
|
|
assert len(intents) == 2 # Or 4? pending to-do in 'IntentManager'.
|
|
|
|
categories = intent_manager.currentAvailableIntentCategories()
|
|
assert "default" in categories # Currently inconsistent with 'currentAvailableIntents'!
|
|
assert "smooth" in categories
|
|
assert "strong" in categories
|
|
assert len(categories) == 3
|
|
|
|
for intent, quality in intents:
|
|
intent_manager.selectIntent(intent, quality)
|
|
assert extruder_stack_a.intent is not None
|
|
assert extruder_stack_b.intent is not None
|
|
# ... need MachineManager for this, split up methods anyway -> make into class, see examples others
|