michael@0: /* -*- Mode: Javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* vim: set ts=2 et sw=2 tw=80: */ michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: const Cu = Components.utils; michael@0: let {Loader} = Cu.import("resource://gre/modules/commonjs/toolkit/loader.js", {}); michael@0: michael@0: let loader = new Loader.Loader({ michael@0: paths: { michael@0: "": "resource://gre/modules/commonjs/", michael@0: "devtools": "resource:///modules/devtools", michael@0: }, michael@0: globals: {}, michael@0: }); michael@0: let require = Loader.Require(loader, { id: "undo-test" }) michael@0: michael@0: let {UndoStack} = require("devtools/shared/undo"); michael@0: michael@0: const MAX_SIZE = 5; michael@0: michael@0: function run_test() michael@0: { michael@0: let str = ""; michael@0: let stack = new UndoStack(MAX_SIZE); michael@0: michael@0: function add(ch) { michael@0: stack.do(function() { michael@0: str += ch; michael@0: }, function() { michael@0: str = str.slice(0, -1); michael@0: }); michael@0: } michael@0: michael@0: do_check_false(stack.canUndo()); michael@0: do_check_false(stack.canRedo()); michael@0: michael@0: // Check adding up to the limit of the size michael@0: add("a"); michael@0: do_check_true(stack.canUndo()); michael@0: do_check_false(stack.canRedo()); michael@0: michael@0: add("b"); michael@0: add("c"); michael@0: add("d"); michael@0: add("e"); michael@0: michael@0: do_check_eq(str, "abcde"); michael@0: michael@0: // Check a simple undo+redo michael@0: stack.undo(); michael@0: michael@0: do_check_eq(str, "abcd"); michael@0: do_check_true(stack.canRedo()); michael@0: michael@0: stack.redo(); michael@0: do_check_eq(str, "abcde") michael@0: do_check_false(stack.canRedo()); michael@0: michael@0: // Check an undo followed by a new action michael@0: stack.undo(); michael@0: do_check_eq(str, "abcd"); michael@0: michael@0: add("q"); michael@0: do_check_eq(str, "abcdq"); michael@0: do_check_false(stack.canRedo()); michael@0: michael@0: stack.undo(); michael@0: do_check_eq(str, "abcd"); michael@0: stack.redo(); michael@0: do_check_eq(str, "abcdq"); michael@0: michael@0: // Revert back to the beginning of the queue... michael@0: while (stack.canUndo()) { michael@0: stack.undo(); michael@0: } michael@0: do_check_eq(str, ""); michael@0: michael@0: // Now put it all back.... michael@0: while (stack.canRedo()) { michael@0: stack.redo(); michael@0: } michael@0: do_check_eq(str, "abcdq"); michael@0: michael@0: // Now go over the undo limit... michael@0: add("1"); michael@0: add("2"); michael@0: add("3"); michael@0: michael@0: do_check_eq(str, "abcdq123"); michael@0: michael@0: // And now undoing the whole stack should only undo 5 actions. michael@0: while (stack.canUndo()) { michael@0: stack.undo(); michael@0: } michael@0: michael@0: do_check_eq(str, "abc"); michael@0: }