Verifies that, when the UndoManager API is enabled, UndoManager and UndoItem interfaces behave as expected.

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".



Testing UndoManager:
PASS UndoManager instanceof Function is true
PASS typeof UndoManager is "function"
PASS document.undoManager instanceof UndoManager is true
PASS Object.getPrototypeOf(document.undoManager) === UndoManager.prototype is true
PASS UndoManager.prototype.addItem instanceof Function is true
PASS UndoManager() threw exception TypeError: Illegal constructor.
PASS new UndoManager() threw exception TypeError: Illegal constructor.
PASS document.undoManager.addItem() threw exception TypeError: Not enough arguments.
PASS document.undoManager.addItem('foo') threw exception TypeError: Argument 1 ('item') to UndoManager.addItem must be an instance of UndoItem.
PASS UndoManager.toString() is "function UndoManager() {\n    [native code]\n}"
PASS document.undoManager.toString() is "[object UndoManager]"

Testing UndoItem:
PASS UndoItem instanceof Function is true
PASS typeof UndoItem is "function"
PASS UndoItem() threw exception TypeError: Constructor requires 'new' operator.
PASS new UndoItem() threw exception TypeError: Not enough arguments.
PASS new UndoItem('foo') threw exception TypeError: Type error.
PASS new UndoItem({ }) threw exception TypeError: Member UndoItemInit.label is required and must be an instance of DOMString.
PASS new UndoItem({ label: null, undo: null }) threw exception TypeError: Member UndoItemInit.redo is required and must be an instance of VoidCallback.
PASS new UndoItem({ redo: null }) threw exception TypeError: Member UndoItemInit.label is required and must be an instance of DOMString.
PASS new UndoItem({ label: '', undo: emptyFunction }) threw exception TypeError: Member UndoItemInit.redo is required and must be an instance of VoidCallback.
PASS new UndoItem({ label: 'hello', redo: emptyFunction }) threw exception TypeError: Member UndoItemInit.undo is required and must be an instance of VoidCallback.
PASS new UndoItem({ label: 3, undo: null, redo: null }) threw exception TypeError: Type error.
PASS new UndoItem({ label: '', undo: '', redo: emptyFunction }) threw exception TypeError: Type error.
PASS new UndoItem({ label: '', undo: emptyFunction, redo: 10 }) threw exception TypeError: Type error.
PASS new UndoItem({ label: '', undo: emptyFunction, redo: emptyFunction, foo: 'hi' }) instanceof UndoItem is true
PASS Object.getPrototypeOf(new UndoItem({ label: '', undo: emptyFunction, redo: emptyFunction })) === UndoItem.prototype is true
PASS new UndoItem({ label: 'foo', undo: emptyFunction, redo: emptyFunction }).label is "foo"
PASS UndoItem.toString() is "function UndoItem() {\n    [native code]\n}"
PASS new UndoItem({ label: '', undo: emptyFunction, redo: emptyFunction }).toString() is "[object UndoItem]"
PASS document.undoManager.addItem(new UndoItem({ label: '', undo: emptyFunction, redo: emptyFunction })) did not throw exception.
PASS successfullyParsed is true

TEST COMPLETE

