it('should dispose of the resources used by the list', () => {
   let list = new ObservableUndoableList(serializer);
   list.dispose();
   expect(list.isDisposed).to.be(true);
   list.dispose();
   expect(list.isDisposed).to.be(true);
 });
 it('should redo a push', () => {
   let list = new ObservableUndoableList(serializer);
   list.push(serializer.fromJSON(value));
   list.undo();
   list.redo();
   expect(list.length).to.be(1);
 });
 it('should undo a pushAll', () => {
   let list = new ObservableUndoableList(serializer);
   list.pushAll([serializer.fromJSON(value),
                   serializer.fromJSON(value)]);
   list.undo();
   expect(list.length).to.be(0);
 });
 it('should not be undoable if isUndoAble is set to false', () => {
   let list = new ObservableUndoableList(serializer);
   list.beginCompoundOperation(false);
   list.push(serializer.fromJSON(value));
   list.push(serializer.fromJSON(value));
   list.endCompoundOperation();
   expect(list.canUndo).to.be(false);
 });
 it('should undo a move', () => {
   let items = [serializer.fromJSON(value),
                serializer.fromJSON(value),
                serializer.fromJSON(value)];
   let list = new ObservableUndoableList(serializer);
   list.pushAll(items);
   list.move(1, 2);
   list.undo();
   expect((list.get(1) as any)['count']).to.be((items[1] as any)['count']);
 });
 it('should redo a removeRange', () => {
   let list = new ObservableUndoableList(serializer);
   list.pushAll([serializer.fromJSON(value),
                   serializer.fromJSON(value),
                   serializer.fromJSON(value),
                   serializer.fromJSON(value),
                   serializer.fromJSON(value),
                   serializer.fromJSON(value)]);
   list.removeRange(1, 3);
   list.undo();
   list.redo();
   expect(list.length).to.be(4);
 });
 it('should end a compound operation', () => {
   let list = new ObservableUndoableList(serializer);
   list.beginCompoundOperation();
   list.push(serializer.fromJSON(value));
   list.push(serializer.fromJSON(value));
   list.endCompoundOperation();
   expect(list.canUndo).to.be(true);
   list.undo();
   expect(list.canUndo).to.be(false);
 });
 it('should return true if there is a change that can be undone', () => {
   let list = new ObservableUndoableList(serializer);
   list.push(serializer.fromJSON(value));
   expect(list.canUndo).to.be(true);
 });
 it('should return true if there is an undo that can be redone', () => {
   let list = new ObservableUndoableList(serializer);
   list.push(new Test(value));
   list.undo();
   expect(list.canRedo).to.be(true);
 });
 it('should clear the undo stack', () => {
   let list = new ObservableUndoableList(serializer);
   list.push(serializer.fromJSON(value));
   list.clearUndo();
   expect(list.canUndo).to.be(false);
 });