Mailspring/spec-nylas/undo-manager-spec.coffee
Evan Morikawa 3807831826 fix(composer): polish composer edge cases
Summary:
Fixes T1327
Fixes T1294
Fixes T1307
Fixes T1207

- More robus Undo Manager
- Scrolls to the most recent undo location
- Fixes a variety of bugs when the composer's cursor ends up in an unsupported
location
- Fixes auto-scroll detection at end of content

Test Plan: edgehill --test

Reviewers: bengotow

Reviewed By: bengotow

Maniphest Tasks: T1207, T1294, T1307, T1327

Differential Revision: https://phab.nylas.com/D1529
2015-05-19 16:12:39 -07:00

148 lines
4.4 KiB
CoffeeScript

UndoManager = require "../src/flux/undo-manager"
describe "UndoManager", ->
beforeEach ->
@undoManager = new UndoManager
afterEach ->
advanceClock(500)
it "Initializes empty", ->
expect(@undoManager._history.length).toBe 0
expect(@undoManager._markers.length).toBe 0
expect(@undoManager._historyIndex).toBe -1
expect(@undoManager._markerIndex).toBe -1
it "can push a history item onto the stack", ->
@undoManager.saveToHistory "A"
advanceClock(500)
expect(@undoManager._history[0]).toBe "A"
expect(@undoManager._history.length).toBe 1
expect(@undoManager.current()).toBe "A"
it "updates the historyIndex", ->
@undoManager.saveToHistory "A"
expect(@undoManager._historyIndex).toBe 0
it "updates the markerIndex", ->
@undoManager.saveToHistory "A"
advanceClock(500)
@undoManager.saveToHistory "AB"
@undoManager.saveToHistory "ABC"
advanceClock(500)
expect(@undoManager._markerIndex).toBe 1
expect(@undoManager._historyIndex).toBe 2
describe "when undoing", ->
beforeEach ->
@undoManager.saveToHistory "A"
advanceClock(500)
@undoManager.saveToHistory "AB"
@undoManager.saveToHistory "ABC"
it "returns the last item on the stack at the most recent marker", ->
expect(@undoManager.undo()).toBe "A"
it "doesn't change the size of the stack", ->
@undoManager.undo()
expect(@undoManager._history.length).toBe 3
it "set the historyIndex properly", ->
@undoManager.undo()
expect(@undoManager._historyIndex).toBe 0
it "set the markerIndex properly after a wait", ->
advanceClock(500)
@undoManager.undo()
expect(@undoManager._markerIndex).toBe 0
it "set the markerIndex properly when undo fires immediately", ->
@undoManager.undo()
expect(@undoManager._markerIndex).toBe 0
it "returns null when there's nothing to undo", ->
@undoManager.undo()
@undoManager.undo()
expect(@undoManager.undo()).toBe null
expect(@undoManager._markerIndex).toBe 0
describe "when redoing", ->
beforeEach ->
@undoManager.saveToHistory "X"
advanceClock(500)
@undoManager.saveToHistory "XY"
@undoManager.saveToHistory "XYZ"
it "returns the last item on the stack after a wait", ->
advanceClock(500)
@undoManager.undo()
advanceClock(500)
expect(@undoManager.redo()).toBe "XYZ"
it "returns the last item on the stack when fired immediately", ->
@undoManager.undo()
expect(@undoManager.redo()).toBe "XYZ"
it "doesn't change the size of the stack", ->
@undoManager.undo()
@undoManager.redo()
expect(@undoManager._history.length).toBe 3
it "set the historyIndex properly", ->
@undoManager.undo()
@undoManager.redo()
expect(@undoManager._historyIndex).toBe 2
it "set the markerIndex properly", ->
@undoManager.undo()
@undoManager.redo()
expect(@undoManager._markerIndex).toBe 1
it "returns null when there's nothing to redo", ->
expect(@undoManager.redo()).toBe null
expect(@undoManager.redo()).toBe null
expect(@undoManager._markerIndex).toBe 1
describe "when undoing and adding items", ->
beforeEach ->
@undoManager.saveToHistory "1"
advanceClock(500)
@undoManager.saveToHistory "12"
@undoManager.saveToHistory "123"
advanceClock(500)
@undoManager.saveToHistory "1234"
@undoManager.undo()
@undoManager.undo()
advanceClock(500)
@undoManager.saveToHistory "A"
advanceClock(500)
it "correctly sets the history", ->
expect(@undoManager._history).toEqual ["1", "A"]
it "correctly sets the length", ->
expect(@undoManager._history.length).toBe 2
it "puts the correct items on the stack", ->
@undoManager.undo()
expect(@undoManager.redo()).toBe "A"
it "sets the historyIndex correctly", ->
expect(@undoManager._historyIndex).toBe 1
describe "when the stack is full", ->
beforeEach ->
@undoManager._MAX_HISTORY_SIZE = 2
@undoManager.saveToHistory "A"
@undoManager.saveToHistory "AB"
@undoManager.saveToHistory "ABC"
@undoManager.saveToHistory "ABCD"
it "correctly sets the length", ->
expect(@undoManager._history.length).toBe 2
it "keeps the latest histories", ->
expect(@undoManager._history).toEqual ["ABC", "ABCD"]
it "updates the historyIndex", ->
expect(@undoManager._historyIndex).toBe 1