Cura/tests/TestConvexHullDecorator.py
2019-05-31 16:10:14 +02:00

98 lines
4 KiB
Python

from unittest.mock import patch, MagicMock
import pytest
from UM.Scene.SceneNode import SceneNode
from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
from cura.Scene.ConvexHullDecorator import ConvexHullDecorator
mocked_application = MagicMock()
mocked_controller = MagicMock()
# We need to mock out this function, otherwise we get a recursion
mocked_controller.isToolOperationActive = MagicMock(return_value = False)
mocked_application.getController = MagicMock(return_value = mocked_controller)
class NonPrintingDecorator(SceneNodeDecorator):
def isNonPrintingMesh(self):
return True
class PrintingDecorator(SceneNodeDecorator):
def isNonPrintingMesh(self):
return False
@pytest.fixture
def convex_hull_decorator():
with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value = mocked_application)):
with patch("UM.Application.Application.getInstance", MagicMock(return_value = mocked_application)):
with patch("cura.Settings.ExtruderManager.ExtruderManager.getInstance"):
return ConvexHullDecorator()
def test_getSetNode(convex_hull_decorator):
node = SceneNode()
with patch("UM.Application.Application.getInstance", MagicMock(return_value=mocked_application)):
convex_hull_decorator.setNode(node)
assert convex_hull_decorator.getNode() == node
def test_getConvexHullBoundaryNoNode(convex_hull_decorator):
assert convex_hull_decorator.getConvexHullBoundary() is None
def test_getConvexHeadFullNoNode(convex_hull_decorator):
assert convex_hull_decorator.getConvexHullHeadFull() is None
def test_getConvexHulLBoundaryNotPrintingMesh(convex_hull_decorator):
node = SceneNode()
node.addDecorator(NonPrintingDecorator())
with patch("UM.Application.Application.getInstance", MagicMock(return_value=mocked_application)):
convex_hull_decorator.setNode(node)
assert convex_hull_decorator.getConvexHullBoundary() is None
def test_getConvexHulLBoundaryPrintingMesh(convex_hull_decorator):
node = SceneNode()
node.addDecorator(PrintingDecorator())
with patch("UM.Application.Application.getInstance", MagicMock(return_value=mocked_application)):
convex_hull_decorator.setNode(node)
# Should still be None, since print sequence is not one at a time
assert convex_hull_decorator.getConvexHullBoundary() is None
def test_getConvexHulLBoundaryPrintingMeshOneAtATime(convex_hull_decorator):
node = SceneNode()
node.addDecorator(PrintingDecorator())
with patch("UM.Application.Application.getInstance", MagicMock(return_value=mocked_application)):
convex_hull_decorator.setNode(node)
convex_hull_decorator._global_stack = MagicMock()
convex_hull_decorator._global_stack.getProperty = MagicMock(return_value = "one_at_a_time")
# In this test we don't care for the result of the function, just that the convex hull computation is called.
convex_hull_decorator._compute2DConvexHull = MagicMock()
convex_hull_decorator.getConvexHullBoundary()
convex_hull_decorator._compute2DConvexHull.assert_called_once_with()
def value_changed(convex_hull_decorator, key):
convex_hull_decorator._onChanged = MagicMock()
convex_hull_decorator._onSettingValueChanged(key, "value")
convex_hull_decorator._onChanged.assert_called_once_with()
# This should have no effect at all
convex_hull_decorator._onSettingValueChanged(key, "not value")
convex_hull_decorator._onChanged.assert_called_once_with()
@pytest.mark.parametrize("key", ConvexHullDecorator._affected_settings)
def test_onSettingValueChangedAffectedSettings(convex_hull_decorator, key):
value_changed(convex_hull_decorator, key)
@pytest.mark.parametrize("key", ConvexHullDecorator._influencing_settings)
def test_onSettingValueChangedInfluencingSettings(convex_hull_decorator, key):
convex_hull_decorator._init2DConvexHullCache = MagicMock()
value_changed(convex_hull_decorator, key)
convex_hull_decorator._init2DConvexHullCache.assert_called_once_with()