diff --git a/tests/Settings/TestExtruderStack.py b/tests/Settings/TestExtruderStack.py index 65ce872883..adfaac3766 100644 --- a/tests/Settings/TestExtruderStack.py +++ b/tests/Settings/TestExtruderStack.py @@ -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): diff --git a/tests/Settings/stacks/Complete.extruder.cfg b/tests/Settings/stacks/Complete.extruder.cfg new file mode 100644 index 0000000000..f7f613991a --- /dev/null +++ b/tests/Settings/stacks/Complete.extruder.cfg @@ -0,0 +1,13 @@ +[general] +version = 3 +name = Complete +id = Complete + +[containers] +0 = some_user_changes +1 = some_quality_changes +2 = some_quality +3 = some_material +4 = some_variant +5 = some_definition_changes +6 = some_definition diff --git a/tests/Settings/stacks/OnlyUser.extruder.cfg b/tests/Settings/stacks/OnlyUser.extruder.cfg new file mode 100644 index 0000000000..31371d2c51 --- /dev/null +++ b/tests/Settings/stacks/OnlyUser.extruder.cfg @@ -0,0 +1,8 @@ +[general] +version = 3 +name = Only User +id = OnlyUser + +[containers] +0 = some_instance +6 = some_definition