### Question:
CloneCanvasNodeCommand extends AbstractCanvasCommand { @Override public CommandResult<CanvasViolation> undo(AbstractCanvasHandler context) { return commands.undo(context); } CloneCanvasNodeCommand(Node parent, Node candidate, String shapeSetId, final ManagedInstance<ChildrenTraverseProcessor> childrenTraverseProcessor); AbstractCanvasCommand createAddCanvasChildNodeCommand(Node parent, Node candidate, String shapeSetId); CloneCanvasNodeCommand createCloneCanvasNodeCommand(Node parent, Node candidate, String shapeSetId); @Override CommandResult<CanvasViolation> execute(AbstractCanvasHandler context); @Override CommandResult<CanvasViolation> undo(AbstractCanvasHandler context); ManagedInstance<ChildrenTraverseProcessor> getChildrenTraverseProcessor(); Node getParent(); Node getCandidate(); String getShapeSetId(); @Override String toString();  }### Answer:
@Test public void testUndo() { testExecute(); cloneCanvasNodeCommand.undo(canvasHandler); verify(canvasHandler, atLeastOnce()).removeChild(parent, candidate); verify(canvasHandler, atLeastOnce()).deregister(candidate); verify(canvasHandler, atLeastOnce()).removeChild(graphInstance.parentNode, graphInstance.startNode); verify(canvasHandler, atLeastOnce()).deregister(graphInstance.startNode); verify(canvasHandler, atLeastOnce()).removeChild(graphInstance.parentNode, graphInstance.intermNode); verify(canvasHandler, atLeastOnce()).deregister(graphInstance.intermNode); verify(canvasHandler, atLeastOnce()).removeChild(graphInstance.parentNode, graphInstance.endNode); verify(canvasHandler, atLeastOnce()).deregister(graphInstance.endNode); verify(canvasHandler, atLeastOnce()).deregister(graphInstance.edge1); verify(canvasHandler, atLeastOnce()).deregister(graphInstance.edge2); }