TestVariantNode.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. # Copyright (c) 2019 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. from unittest.mock import patch, MagicMock
  4. import pytest
  5. from cura.Machines.VariantNode import VariantNode
  6. import copy
  7. instance_container_metadata_dict = {"fdmprinter": {"no_variant": [{"base_file": "material_1", "id": "material_1"}, {"base_file": "material_2", "id": "material_2"}]},
  8. "machine_1": {"no_variant": [{"base_file": "material_1", "id": "material_1"}, {"base_file": "material_2", "id": "material_2"}],
  9. "Variant One": [{"base_file": "material_1", "id": "material_1"}, {"base_file": "material_2", "id": "material_2"}]}}
  10. material_node_added_test_data = [({"type": "Not a material"}, ["material_1", "material_2"]), # Wrong type
  11. ({"type": "material", "base_file": "material_3"}, ["material_1", "material_2"]), # material_3 is on the "NOPE" list.
  12. ({"type": "material", "base_file": "material_4", "definition": "machine_3"}, ["material_1", "material_2"]), # Wrong machine
  13. ({"type": "material", "base_file": "material_4", "definition": "machine_1"}, ["material_1", "material_2"]), # No variant
  14. ({"type": "material", "base_file": "material_4", "definition": "machine_1", "variant_name": "Variant Three"}, ["material_1", "material_2"]), # Wrong variant
  15. ({"type": "material", "base_file": "material_4", "definition": "machine_1", "variant_name": "Variant One"}, ["material_1", "material_2", "material_4"])
  16. ]
  17. material_node_update_test_data = [({"type": "material", "base_file": "material_1", "definition": "machine_1", "variant_name": "Variant One"}, ["material_1"], ["material_2"]),
  18. ({"type": "material", "base_file": "material_1", "definition": "fdmprinter", "variant_name": "Variant One"}, [], ["material_2", "material_1"]), # Too generic
  19. ({"type": "material", "base_file": "material_1", "definition": "machine_2", "variant_name": "Variant One"}, [], ["material_2", "material_1"]) # Wrong definition
  20. ]
  21. metadata_dict = {}
  22. def getMetadataEntrySideEffect(*args, **kwargs):
  23. return metadata_dict.get(args[0])
  24. def getInstanceContainerSideEffect(*args, **kwargs):
  25. variant = kwargs.get("variant")
  26. definition = kwargs.get("definition")
  27. if variant is not None:
  28. return instance_container_metadata_dict.get(definition).get(variant)
  29. return instance_container_metadata_dict.get(definition).get("no_variant")
  30. @pytest.fixture
  31. def machine_node():
  32. mocked_machine_node = MagicMock()
  33. mocked_machine_node.container_id = "machine_1"
  34. return mocked_machine_node
  35. @pytest.fixture
  36. def container_registry():
  37. result = MagicMock()
  38. result.findInstanceContainersMetadata = MagicMock(side_effect = getInstanceContainerSideEffect)
  39. result.findContainersMetadata = MagicMock(return_value = [{"name": "Variant One"}])
  40. return result
  41. def createMockedInstanceContainer():
  42. result = MagicMock()
  43. result.getMetaDataEntry = MagicMock(side_effect=getMetadataEntrySideEffect)
  44. return result
  45. def createVariantNode(container_id, machine_node, container_registry):
  46. with patch("cura.Machines.VariantNode.MaterialNode"): # We're not testing the material node here, so patch it out.
  47. with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
  48. return VariantNode(container_id, machine_node)
  49. def test_variantNodeInit(container_registry, machine_node):
  50. node = createVariantNode("variant_1", machine_node, container_registry)
  51. assert "material_1" in node.materials
  52. assert "material_2" in node.materials
  53. assert len(node.materials) == 2
  54. def test_variantNodeInit_excludedMaterial(container_registry, machine_node):
  55. machine_node.exclude_materials = ["material_1"]
  56. node = createVariantNode("variant_1", machine_node, container_registry)
  57. assert "material_1" not in node.materials
  58. assert "material_2" in node.materials
  59. assert len(node.materials) == 1
  60. @pytest.mark.parametrize("metadata,material_result_list", material_node_added_test_data)
  61. def test_materialAdded(container_registry, machine_node, metadata, material_result_list):
  62. variant_node = createVariantNode("machine_1", machine_node, container_registry)
  63. machine_node.exclude_materials = ["material_3"]
  64. with patch("cura.Machines.VariantNode.MaterialNode"): # We're not testing the material node here, so patch it out.
  65. with patch.dict(metadata_dict, metadata):
  66. mocked_container = createMockedInstanceContainer()
  67. variant_node._materialAdded(mocked_container)
  68. assert len(material_result_list) == len(variant_node.materials)
  69. for name in material_result_list:
  70. assert name in variant_node.materials
  71. @pytest.mark.parametrize("metadata,changed_material_list,unchanged_material_list", material_node_update_test_data)
  72. def test_materialAdded_update(container_registry, machine_node, metadata, changed_material_list, unchanged_material_list):
  73. variant_node = createVariantNode("machine_1", machine_node, container_registry)
  74. original_material_nodes = copy.copy(variant_node.materials)
  75. with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)):
  76. with patch("cura.Machines.VariantNode.MaterialNode"): # We're not testing the material node here, so patch it out.
  77. with patch.dict(metadata_dict, metadata):
  78. mocked_container = createMockedInstanceContainer()
  79. variant_node._materialAdded(mocked_container)
  80. for key in unchanged_material_list:
  81. assert original_material_nodes[key] == variant_node.materials[key]
  82. for key in changed_material_list:
  83. assert original_material_nodes[key] != variant_node.materials[key]
  84. def test_preferredMaterialExactMatch():
  85. container_registry = MagicMock(
  86. findContainersMetadata = MagicMock(return_value = [{"name": "test variant name"}])
  87. )
  88. machine_node = MagicMock(preferred_material = "preferred_material_base_file")
  89. # Construct our own variant node with certain materials available.
  90. with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)):
  91. with patch("cura.Machines.VariantNode.VariantNode._loadAll", MagicMock()):
  92. variant_node = VariantNode("test_variant", machine_node)
  93. variant_node.materials = {
  94. "some_different_material": MagicMock(getMetaDataEntry = lambda x: 3),
  95. "preferred_material_base_file": MagicMock(getMetaDataEntry = lambda x: 3) # Exact match.
  96. }
  97. assert variant_node.preferredMaterial(approximate_diameter = 3) == variant_node.materials["preferred_material_base_file"], "It should match exactly on this one since it's the preferred material."