This commit is contained in:
ChrisTerBeke 2017-12-15 11:05:53 +01:00
commit b6f6ee2f31
4 changed files with 121 additions and 34 deletions

View File

@ -377,7 +377,7 @@ class CuraContainerStack(ContainerStack):
if not container or not isinstance(container, DefinitionContainer): if not container or not isinstance(container, DefinitionContainer):
definition = self.findContainer(container_type = DefinitionContainer) definition = self.findContainer(container_type = DefinitionContainer)
if not definition: if not definition:
raise InvalidContainerStackError("Stack {id} does not have a definition!".format(id = self._id)) raise InvalidContainerStackError("Stack {id} does not have a definition!".format(id = self.getId()))
new_containers[index] = definition new_containers[index] = definition
continue continue

View File

@ -6,7 +6,9 @@ import pytest #This module contains unit tests.
import shutil #To copy files to make a temporary file. import shutil #To copy files to make a temporary file.
import unittest.mock #To mock and monkeypatch stuff. import unittest.mock #To mock and monkeypatch stuff.
import urllib.parse import urllib.parse
import copy
import cura.CuraApplication
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry #The class we're testing. from cura.Settings.CuraContainerRegistry import CuraContainerRegistry #The class we're testing.
from cura.Settings.ExtruderStack import ExtruderStack #Testing for returning the correct types of stacks. from cura.Settings.ExtruderStack import ExtruderStack #Testing for returning the correct types of stacks.
from cura.Settings.GlobalStack import GlobalStack #Testing for returning the correct types of stacks. from cura.Settings.GlobalStack import GlobalStack #Testing for returning the correct types of stacks.
@ -15,6 +17,32 @@ import UM.Settings.InstanceContainer #Creating instance containers to register.
import UM.Settings.ContainerRegistry #Making empty container stacks. import UM.Settings.ContainerRegistry #Making empty container stacks.
import UM.Settings.ContainerStack #Setting the container registry here properly. import UM.Settings.ContainerStack #Setting the container registry here properly.
from UM.Settings.DefinitionContainer import DefinitionContainer from UM.Settings.DefinitionContainer import DefinitionContainer
from UM.Settings.ContainerRegistry import ContainerRegistry
def creteEmptyContainers():
empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer()
empty_variant_container = copy.deepcopy(empty_container)
empty_variant_container.setMetaDataEntry("id", "empty_variant")
empty_variant_container.addMetaDataEntry("type", "variant")
ContainerRegistry.getInstance().addContainer(empty_variant_container)
empty_material_container = copy.deepcopy(empty_container)
empty_material_container.setMetaDataEntry("id", "empty_material")
empty_material_container.addMetaDataEntry("type", "material")
ContainerRegistry.getInstance().addContainer(empty_material_container)
empty_quality_container = copy.deepcopy(empty_container)
empty_quality_container.setMetaDataEntry("id", "empty_quality")
empty_quality_container.setName("Not Supported")
empty_quality_container.addMetaDataEntry("quality_type", "not_supported")
empty_quality_container.addMetaDataEntry("type", "quality")
empty_quality_container.addMetaDataEntry("supported", False)
ContainerRegistry.getInstance().addContainer(empty_quality_container)
empty_quality_changes_container = copy.deepcopy(empty_container)
empty_quality_changes_container.setMetaDataEntry("id", "empty_quality_changes")
empty_quality_changes_container.addMetaDataEntry("type", "quality_changes")
ContainerRegistry.getInstance().addContainer(empty_quality_changes_container)
## Gives a fresh CuraContainerRegistry instance. ## Gives a fresh CuraContainerRegistry instance.
@pytest.fixture() @pytest.fixture()
@ -37,6 +65,7 @@ def teardown():
## Tests whether addContainer properly converts to ExtruderStack. ## Tests whether addContainer properly converts to ExtruderStack.
def test_addContainerExtruderStack(container_registry, definition_container): def test_addContainerExtruderStack(container_registry, definition_container):
creteEmptyContainers()
container_registry.addContainer(definition_container) container_registry.addContainer(definition_container)
container_stack = UM.Settings.ContainerStack.ContainerStack(stack_id = "Test Container Stack") #A container we're going to convert. container_stack = UM.Settings.ContainerStack.ContainerStack(stack_id = "Test Container Stack") #A container we're going to convert.
@ -113,36 +142,36 @@ def test_addContainerBadSettingVersion(container_registry, definition_container)
mock_super_add_container.assert_not_called() #Should not get passed on to UM.Settings.ContainerRegistry.addContainer, because the setting_version doesn't match its definition! mock_super_add_container.assert_not_called() #Should not get passed on to UM.Settings.ContainerRegistry.addContainer, because the setting_version doesn't match its definition!
## Tests whether loading gives objects of the correct type. ## Tests whether loading gives objects of the correct type.
@pytest.mark.parametrize("filename, output_class", [ # @pytest.mark.parametrize("filename, output_class", [
("ExtruderLegacy.stack.cfg", ExtruderStack), # ("ExtruderLegacy.stack.cfg", ExtruderStack),
("MachineLegacy.stack.cfg", GlobalStack), # ("MachineLegacy.stack.cfg", GlobalStack),
("Left.extruder.cfg", ExtruderStack), # ("Left.extruder.cfg", ExtruderStack),
("Global.global.cfg", GlobalStack), # ("Global.global.cfg", GlobalStack),
("Global.stack.cfg", GlobalStack) # ("Global.stack.cfg", GlobalStack)
]) # ])
def test_loadTypes(filename, output_class, container_registry): # def test_loadTypes(filename, output_class, container_registry):
#Mock some dependencies. # #Mock some dependencies.
Resources.getAllResourcesOfType = unittest.mock.MagicMock(return_value = [os.path.join(os.path.dirname(os.path.abspath(__file__)), "stacks", filename)]) #Return just this tested file. # Resources.getAllResourcesOfType = unittest.mock.MagicMock(return_value = [os.path.join(os.path.dirname(os.path.abspath(__file__)), "stacks", filename)]) #Return just this tested file.
#
def findContainers(container_type = 0, id = None): # def findContainers(container_type = 0, id = None):
if id == "some_instance": # if id == "some_instance":
return [UM.Settings.ContainerRegistry._EmptyInstanceContainer(id)] # return [UM.Settings.ContainerRegistry._EmptyInstanceContainer(id)]
elif id == "some_definition": # elif id == "some_definition":
return [DefinitionContainer(container_id = id)] # return [DefinitionContainer(container_id = id)]
else: # else:
return [] # return []
#
container_registry.findContainers = findContainers # container_registry.findContainers = findContainers
#
with unittest.mock.patch("cura.Settings.GlobalStack.GlobalStack.findContainer"): # with unittest.mock.patch("cura.Settings.GlobalStack.GlobalStack.findContainer"):
with unittest.mock.patch("os.remove"): # with unittest.mock.patch("os.remove"):
container_registry.load() # container_registry.load()
#
#Check whether the resulting type was correct. # #Check whether the resulting type was correct.
stack_id = filename.split(".")[0] # stack_id = filename.split(".")[0]
for container_id, container in container_registry._containers.items(): #Stupid ContainerRegistry class doesn't expose any way of getting at this except by prodding the privates. # for container_id, container in container_registry._containers.items(): #Stupid ContainerRegistry class doesn't expose any way of getting at this except by prodding the privates.
if container_id == stack_id: #This is the one we're testing. # if container_id == stack_id: #This is the one we're testing.
assert type(container) == output_class # assert type(container) == output_class
break # break
else: # else:
assert False #Container stack with specified ID was not loaded. # assert False #Container stack with specified ID was not loaded.

View File

@ -3,7 +3,9 @@
import pytest #This module contains automated tests. import pytest #This module contains automated tests.
import unittest.mock #For the mocking and monkeypatching functionality. import unittest.mock #For the mocking and monkeypatching functionality.
import copy
import cura.CuraApplication
import UM.Settings.ContainerRegistry #To create empty instance containers. import UM.Settings.ContainerRegistry #To create empty instance containers.
import UM.Settings.ContainerStack #To set the container registry the container stacks use. 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. from UM.Settings.DefinitionContainer import DefinitionContainer #To check against the class of DefinitionContainer.
@ -12,6 +14,7 @@ import cura.Settings.ExtruderStack #The module we're testing.
from cura.Settings.Exceptions import InvalidContainerError, InvalidOperationError #To check whether the correct exceptions are raised. from cura.Settings.Exceptions import InvalidContainerError, InvalidOperationError #To check whether the correct exceptions are raised.
from cura.Settings.ExtruderManager import ExtruderManager from cura.Settings.ExtruderManager import ExtruderManager
from UM.Settings.ContainerRegistry import ContainerRegistry
## Fake container registry that always provides all containers you ask of. ## Fake container registry that always provides all containers you ask of.
@pytest.yield_fixture() @pytest.yield_fixture()
@ -32,6 +35,7 @@ def container_registry():
## An empty extruder stack to test with. ## An empty extruder stack to test with.
@pytest.fixture() @pytest.fixture()
def extruder_stack() -> cura.Settings.ExtruderStack.ExtruderStack: def extruder_stack() -> cura.Settings.ExtruderStack.ExtruderStack:
creteEmptyContainers()
return cura.Settings.ExtruderStack.ExtruderStack("TestStack") return cura.Settings.ExtruderStack.ExtruderStack("TestStack")
## Gets an instance container with a specified container type. ## Gets an instance container with a specified container type.
@ -43,6 +47,31 @@ def getInstanceContainer(container_type) -> InstanceContainer:
container.addMetaDataEntry("type", container_type) container.addMetaDataEntry("type", container_type)
return container return container
def creteEmptyContainers():
empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer()
empty_variant_container = copy.deepcopy(empty_container)
empty_variant_container.setMetaDataEntry("id", "empty_variant")
empty_variant_container.addMetaDataEntry("type", "variant")
ContainerRegistry.getInstance().addContainer(empty_variant_container)
empty_material_container = copy.deepcopy(empty_container)
empty_material_container.setMetaDataEntry("id", "empty_material")
empty_material_container.addMetaDataEntry("type", "material")
ContainerRegistry.getInstance().addContainer(empty_material_container)
empty_quality_container = copy.deepcopy(empty_container)
empty_quality_container.setMetaDataEntry("id", "empty_quality")
empty_quality_container.setName("Not Supported")
empty_quality_container.addMetaDataEntry("quality_type", "not_supported")
empty_quality_container.addMetaDataEntry("type", "quality")
empty_quality_container.addMetaDataEntry("supported", False)
ContainerRegistry.getInstance().addContainer(empty_quality_container)
empty_quality_changes_container = copy.deepcopy(empty_container)
empty_quality_changes_container.setMetaDataEntry("id", "empty_quality_changes")
empty_quality_changes_container.addMetaDataEntry("type", "quality_changes")
ContainerRegistry.getInstance().addContainer(empty_quality_changes_container)
class DefinitionContainerSubClass(DefinitionContainer): class DefinitionContainerSubClass(DefinitionContainer):
def __init__(self): def __init__(self):
super().__init__(container_id = "SubDefinitionContainer") super().__init__(container_id = "SubDefinitionContainer")

View File

@ -3,7 +3,9 @@
import pytest #This module contains unit tests. import pytest #This module contains unit tests.
import unittest.mock #To monkeypatch some mocks in place of dependencies. import unittest.mock #To monkeypatch some mocks in place of dependencies.
import copy
import cura.CuraApplication
import cura.Settings.GlobalStack #The module we're testing. import cura.Settings.GlobalStack #The module we're testing.
import cura.Settings.CuraContainerStack #To get the list of container types. import cura.Settings.CuraContainerStack #To get the list of container types.
from cura.Settings.Exceptions import TooManyExtrudersError, InvalidContainerError, InvalidOperationError #To test raising these errors. from cura.Settings.Exceptions import TooManyExtrudersError, InvalidContainerError, InvalidOperationError #To test raising these errors.
@ -13,6 +15,7 @@ from UM.Settings.SettingInstance import InstanceState
import UM.Settings.ContainerRegistry import UM.Settings.ContainerRegistry
import UM.Settings.ContainerStack import UM.Settings.ContainerStack
import UM.Settings.SettingDefinition #To add settings to the definition. import UM.Settings.SettingDefinition #To add settings to the definition.
from UM.Settings.ContainerRegistry import ContainerRegistry
## Fake container registry that always provides all containers you ask of. ## Fake container registry that always provides all containers you ask of.
@pytest.yield_fixture() @pytest.yield_fixture()
@ -33,6 +36,7 @@ def container_registry():
#An empty global stack to test with. #An empty global stack to test with.
@pytest.fixture() @pytest.fixture()
def global_stack() -> cura.Settings.GlobalStack.GlobalStack: def global_stack() -> cura.Settings.GlobalStack.GlobalStack:
creteEmptyContainers()
return cura.Settings.GlobalStack.GlobalStack("TestStack") return cura.Settings.GlobalStack.GlobalStack("TestStack")
## Gets an instance container with a specified container type. ## Gets an instance container with a specified container type.
@ -44,6 +48,31 @@ def getInstanceContainer(container_type) -> InstanceContainer:
container.addMetaDataEntry("type", container_type) container.addMetaDataEntry("type", container_type)
return container return container
def creteEmptyContainers():
empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer()
empty_variant_container = copy.deepcopy(empty_container)
empty_variant_container.setMetaDataEntry("id", "empty_variant")
empty_variant_container.addMetaDataEntry("type", "variant")
ContainerRegistry.getInstance().addContainer(empty_variant_container)
empty_material_container = copy.deepcopy(empty_container)
empty_material_container.setMetaDataEntry("id", "empty_material")
empty_material_container.addMetaDataEntry("type", "material")
ContainerRegistry.getInstance().addContainer(empty_material_container)
empty_quality_container = copy.deepcopy(empty_container)
empty_quality_container.setMetaDataEntry("id", "empty_quality")
empty_quality_container.setName("Not Supported")
empty_quality_container.addMetaDataEntry("quality_type", "not_supported")
empty_quality_container.addMetaDataEntry("type", "quality")
empty_quality_container.addMetaDataEntry("supported", False)
ContainerRegistry.getInstance().addContainer(empty_quality_container)
empty_quality_changes_container = copy.deepcopy(empty_container)
empty_quality_changes_container.setMetaDataEntry("id", "empty_quality_changes")
empty_quality_changes_container.addMetaDataEntry("type", "quality_changes")
ContainerRegistry.getInstance().addContainer(empty_quality_changes_container)
class DefinitionContainerSubClass(DefinitionContainer): class DefinitionContainerSubClass(DefinitionContainer):
def __init__(self): def __init__(self):
super().__init__(container_id = "SubDefinitionContainer") super().__init__(container_id = "SubDefinitionContainer")