|
@@ -1,16 +1,52 @@
|
|
|
# Copyright (c) 2017 Ultimaker B.V.
|
|
|
# Cura is released under the terms of the AGPLv3 or higher.
|
|
|
|
|
|
+import os.path #To find the test stack files.
|
|
|
import pytest #This module contains automated tests.
|
|
|
import unittest.mock #For the mocking and monkeypatching functionality.
|
|
|
|
|
|
+import UM.Settings.ContainerRegistry #To create empty instance containers.
|
|
|
+import UM.Settings.ContainerStack #To set the container registry the container stacks use.
|
|
|
+from UM.Settings.DefinitionContainer import DefinitionContainer #To check against the class of DefinitionContainer.
|
|
|
import cura.Settings.ExtruderStack #The module we're testing.
|
|
|
from cura.Settings.Exceptions import InvalidOperationError #To check whether the correct exceptions are raised.
|
|
|
|
|
|
+## Fake container registry that always provides all containers you ask of.
|
|
|
+@pytest.fixture()
|
|
|
+def container_registry():
|
|
|
+ registry = unittest.mock.MagicMock()
|
|
|
+ def findContainers(id = None):
|
|
|
+ if not id:
|
|
|
+ return [UM.Settings.ContainerRegistry._EmptyInstanceContainer("test_container")]
|
|
|
+ else:
|
|
|
+ return [UM.Settings.ContainerRegistry._EmptyInstanceContainer(id)]
|
|
|
+ registry.findContainers = findContainers
|
|
|
+ return registry
|
|
|
+
|
|
|
## An empty extruder stack to test with.
|
|
|
@pytest.fixture()
|
|
|
def extruder_stack() -> cura.Settings.ExtruderStack.ExtruderStack:
|
|
|
- return cura.Settings.ExtruderStack.ExtruderStack
|
|
|
+ return cura.Settings.ExtruderStack.ExtruderStack("TestStack")
|
|
|
+
|
|
|
+## Place-in function for findContainer that finds only containers that start
|
|
|
+# with "some_".
|
|
|
+def findSomeContainers(container_id = "*", container_type = None, type = None, category = "*"):
|
|
|
+ if container_id.startswith("some_"):
|
|
|
+ return UM.Settings.ContainerRegistry._EmptyInstanceContainer(container_id)
|
|
|
+ if container_type == DefinitionContainer:
|
|
|
+ definition_mock = unittest.mock.MagicMock()
|
|
|
+ definition_mock.getId = unittest.mock.MagicMock(return_value = "some_definition") #getId returns some_definition.
|
|
|
+ return definition_mock
|
|
|
+
|
|
|
+## Helper function to read the contents of a container stack in the test
|
|
|
+# stack folder.
|
|
|
+#
|
|
|
+# \param filename The name of the file in the "stacks" folder to read from.
|
|
|
+# \return The contents of that file.
|
|
|
+def readStack(filename):
|
|
|
+ with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "stacks", filename)) as file_handle:
|
|
|
+ serialized = file_handle.read()
|
|
|
+ return serialized
|
|
|
|
|
|
#############################START OF TEST CASES################################
|
|
|
|
|
@@ -19,6 +55,26 @@ def test_addContainer(extruder_stack):
|
|
|
with pytest.raises(InvalidOperationError):
|
|
|
extruder_stack.addContainer(unittest.mock.MagicMock())
|
|
|
|
|
|
+@pytest.mark.parametrize("filename, user_changes_id", [
|
|
|
+ ("Left.extruder.cfg", "empty"),
|
|
|
+ ("ExtruderLegacy.stack.cfg", "empty"),
|
|
|
+ ("OnlyUser.extruder.cfg", "some_instance"),
|
|
|
+ ("Complete.extruder.cfg", "some_user_changes")
|
|
|
+])
|
|
|
+def test_deserializeUserChanges(filename, user_changes_id, container_registry, extruder_stack):
|
|
|
+ serialized = readStack(filename)
|
|
|
+
|
|
|
+ #Mock the loading of the instance containers.
|
|
|
+ extruder_stack.findContainer = findSomeContainers
|
|
|
+ original_container_registry = UM.Settings.ContainerStack._containerRegistry
|
|
|
+ UM.Settings.ContainerStack._containerRegistry = container_registry #Always has all profiles you ask of.
|
|
|
+
|
|
|
+ extruder_stack.deserialize(serialized)
|
|
|
+ assert extruder_stack.userChanges.getId() == user_changes_id
|
|
|
+
|
|
|
+ #Restore.
|
|
|
+ UM.Settings.ContainerStack._containerRegistry = original_container_registry
|
|
|
+
|
|
|
## Tests whether inserting a container is properly forbidden.
|
|
|
def test_insertContainer(extruder_stack):
|
|
|
with pytest.raises(InvalidOperationError):
|