def testUndoDo(self): """ Test an undo() do() sequence. """ state = {"done": True, "actions": 2} def doneCb(action, value): state["done"] = value state["done"] = 2 class Action(UndoableAction): def do(self): state["actions"] += 1 self._done() def undo(self): state["actions"] -= 1 self._undone() stack = UndoableActionStack("meh") stack.connect("done", doneCb, True) stack.connect("undone", doneCb, False) action1 = Action() action2 = Action() stack.push(action1) stack.push(action2) stack.undo() self.failUnlessEqual(state["actions"], 0) self.failIf(state["done"]) stack.do() self.failUnlessEqual(state["actions"], 2) self.failUnless(state["done"])
def testUndoError(self): """ Undo a stack containing a failing action. """ state = {"done": True} def doneCb(action, value): state["done"] = value state["actions"] = 2 class Action(UndoableAction): def undo(self): state["actions"] -= 1 if state["actions"] == 1: self.__class__.undo = self.__class__.undo_fail self._undone() def undo_fail(self): raise UndoError("meh") stack = UndoableActionStack("meh") stack.connect("done", doneCb) action1 = Action() action2 = Action() stack.push(action1) stack.push(action2) self.failUnlessRaises(UndoError, stack.undo) self.failUnlessEqual(state["actions"], 1) self.failUnless(state["done"])