def test_SceneNodeDecorator(): test_node = SceneNode() test_decorator = SceneNodeDecorator() amazing_decorator = TheAmazingTestDecorator() less_amazing_decorator = TheLessAmazingTestDecorator() not_amazing_decorator = TheNotSoAmazingTestDecorator() # Replace emit with mock object test_node.decoratorsChanged.emit = MagicMock() test_decorator.clear = MagicMock() # First actual change test_node.addDecorator(test_decorator) assert len(test_node.getDecorators()) == 1 assert test_node.decoratorsChanged.emit.call_count == 1 # Adding a decorator of the same type (SceneNodeDecorator) again should not do anything. test_node.addDecorator(test_decorator) assert len(test_node.getDecorators()) == 1 assert test_node.decoratorsChanged.emit.call_count == 1 assert test_node.getDecorator(type(test_decorator)) == test_decorator # Remove the decorator again! test_node.removeDecorator(SceneNodeDecorator) assert len(test_node.getDecorators()) == 0 assert test_node.decoratorsChanged.emit.call_count == 2 assert test_decorator.clear.call_count == 1 # Ensure that the clear of the test decorator is called. # Add a number of decorators! test_node.addDecorator(amazing_decorator) test_node.addDecorator(less_amazing_decorator) test_node.addDecorator(not_amazing_decorator) assert test_node.decoratorsChanged.emit.call_count == 5 assert len(test_node.getDecorators()) == 3 assert test_node.hasDecoration("zomg") == False assert test_node.hasDecoration("theOkayDecoration") assert test_node.hasDecoration("theAmazingDecoration") # Calling the decorations with args / kwargs assert test_node.callDecoration("theOkayDecoration", None) is None assert test_node.callDecoration("theEvenMoreAmazingDecoration", "beep") == ("beep", "Wow", "so wow") assert test_node.callDecoration("theEvenMoreAmazingDecoration", "beep", much_test="Wow") == ("beep", "Wow", "Wow") # Calling decoration that is "double" assert test_node.callDecoration("theAmazingDecoration") == "Amazing!" test_node.removeDecorator(TheAmazingTestDecorator) assert test_node.callDecoration("theAmazingDecoration") == "amazing" not_amazing_decorator.clear = MagicMock() test_node.removeDecorators() # Also assure that removing all decorators also triggers the clear assert not_amazing_decorator.clear.call_count == 1 assert len(test_node.getDecorators()) == 0 assert test_node.decoratorsChanged.emit.call_count == 7 assert test_node.getDecorator(type(test_decorator)) is None
def test_SceneNodeDecorator(): test_node = SceneNode() test_decorator = SceneNodeDecorator() amazing_decorator = TheAmazingTestDecorator() less_amazing_decorator = TheLessAmazingTestDecorator() not_amazing_decorator = TheNotSoAmazingTestDecorator() # Replace emit with mock object test_node.decoratorsChanged.emit = MagicMock() test_decorator.clear = MagicMock() # First actual change test_node.addDecorator(test_decorator) assert len(test_node.getDecorators()) == 1 assert test_node.decoratorsChanged.emit.call_count == 1 # Adding a decorator of the same type (SceneNodeDecorator) again should not do anything. test_node.addDecorator(test_decorator) assert len(test_node.getDecorators()) == 1 assert test_node.decoratorsChanged.emit.call_count == 1 assert test_node.getDecorator(type(test_decorator)) == test_decorator # Remove the decorator again! test_node.removeDecorator(SceneNodeDecorator) assert len(test_node.getDecorators()) == 0 assert test_node.decoratorsChanged.emit.call_count == 2 assert test_decorator.clear.call_count == 1 # Ensure that the clear of the test decorator is called. # Add a number of decorators! test_node.addDecorator(amazing_decorator) test_node.addDecorator(less_amazing_decorator) test_node.addDecorator(not_amazing_decorator) assert test_node.decoratorsChanged.emit.call_count == 5 assert len(test_node.getDecorators()) == 3 assert test_node.hasDecoration("zomg") == False assert test_node.hasDecoration("theOkayDecoration") assert test_node.hasDecoration("theAmazingDecoration") # Calling the decorations with args / kwargs assert test_node.callDecoration("theOkayDecoration", None) is None assert test_node.callDecoration("theEvenMoreAmazingDecoration", "beep") == ("beep", "Wow", "so wow") assert test_node.callDecoration("theEvenMoreAmazingDecoration", "beep", much_test = "Wow") == ("beep", "Wow", "Wow") # Calling decoration that is "double" assert test_node.callDecoration("theAmazingDecoration") == "Amazing!" test_node.removeDecorator(TheAmazingTestDecorator) assert test_node.callDecoration("theAmazingDecoration") == "amazing" not_amazing_decorator.clear = MagicMock() test_node.removeDecorators() # Also assure that removing all decorators also triggers the clear assert not_amazing_decorator.clear.call_count == 1 assert len(test_node.getDecorators()) == 0 assert test_node.decoratorsChanged.emit.call_count == 7 assert test_node.getDecorator(type(test_decorator)) is None
def addDecorator(self, decorator: SceneNodeDecorator) -> None: if type(decorator) in [type(dec) for dec in self._decorators]: Logger.log("w", "Unable to add the same decorator type (%s) to a SceneNode twice.", type(decorator)) return try: decorator.setNode(self) except AttributeError: Logger.logException("e", "Unable to add decorator.") return self._decorators.append(decorator) self.decoratorsChanged.emit(self)
def addDecorator(self, decorator: SceneNodeDecorator): if type(decorator) in [type(dec) for dec in self._decorators]: Logger.log("w", "Unable to add the same decorator type (%s) to a SceneNode twice.", type(decorator)) return try: decorator.setNode(self) except AttributeError: Logger.logException("e", "Unable to add decorator.") return self._decorators.append(decorator) self.decoratorsChanged.emit(self)