💚 Finish fixing tiles/lines specs

This commit is contained in:
Antonio Scandurra
2015-05-13 12:26:20 +02:00
parent 29c6e9d89c
commit 49c48234f2
2 changed files with 44 additions and 51 deletions

View File

@@ -658,6 +658,11 @@ describe "TextEditorPresenter", ->
expect(presenter.getState().content.placeholderText).toBe "new-placeholder-text"
describe ".tiles", ->
lineStateForScreenRow = (presenter, row) ->
lineId = presenter.model.tokenizedLineForScreenRow(row).id
tileRow = presenter.tileForRow(row)
presenter.getState().content.tiles[tileRow].lines[lineId]
it "contains states for tiles that are visible on screen", ->
presenter = buildPresenter(explicitHeight: 6, scrollTop: 0, lineHeight: 1, tileCount: 3)
@@ -676,7 +681,6 @@ describe "TextEditorPresenter", ->
expect(presenter.getState().content.tiles[8]).toBeUndefined()
it "includes state for all tiles if no external ::explicitHeight is assigned", ->
presenter = buildPresenter(explicitHeight: null, tileCount: 12, tileOverdrawMargin: 1)
expect(presenter.getState().content.tiles[0]).toBeDefined()
@@ -749,80 +753,68 @@ describe "TextEditorPresenter", ->
expect(presenter.getState().content.tiles[6]).toBeUndefined()
it "updates when the editor's content changes", ->
lineStateForScreenRow = (presenter, tile, row) ->
lineId = presenter.model.tokenizedLineForScreenRow(row).id
presenter.getState().content.tiles[tile].lines[lineId]
presenter = buildPresenter(explicitHeight: 25, scrollTop: 10, lineHeight: 10, tileCount: 3, tileOverdrawMargin: 1)
expectStateUpdate presenter, -> buffer.insert([2, 0], "hello\nworld\n")
line1 = editor.tokenizedLineForScreenRow(1)
expectValues lineStateForScreenRow(presenter, 1, 1), {
expectValues lineStateForScreenRow(presenter, 1), {
text: line1.text
tokens: line1.tokens
}
line2 = editor.tokenizedLineForScreenRow(2)
expectValues lineStateForScreenRow(presenter, 2, 2), {
expectValues lineStateForScreenRow(presenter, 2), {
text: line2.text
tokens: line2.tokens
}
line3 = editor.tokenizedLineForScreenRow(3)
expectValues lineStateForScreenRow(presenter, 3, 3), {
expectValues lineStateForScreenRow(presenter, 3), {
text: line3.text
tokens: line3.tokens
}
xdescribe ".lines", ->
it "does not remove out-of-view lines corresponding to ::mouseWheelScreenRow until ::stoppedScrollingDelay elapses", ->
presenter = buildPresenter(explicitHeight: 25, scrollTop: 0, lineHeight: 10, lineOverdrawMargin: 1, stoppedScrollingDelay: 200)
it "does not remove out-of-view tiles corresponding to ::scrollingTileId until ::stoppedScrollingDelay elapses", ->
presenter = buildPresenter(explicitHeight: 6, scrollTop: 0, lineHeight: 1, tileCount: 3, stoppedScrollingDelay: 200)
expect(lineStateForScreenRow(presenter, 0)).toBeDefined()
expect(lineStateForScreenRow(presenter, 4)).toBeDefined()
expect(lineStateForScreenRow(presenter, 5)).toBeUndefined()
expect(presenter.getState().content.tiles[0]).toBeDefined()
expect(presenter.getState().content.tiles[6]).toBeDefined()
expect(presenter.getState().content.tiles[8]).toBeUndefined()
presenter.setMouseWheelScreenRow(0)
expectStateUpdate presenter, -> presenter.setScrollTop(35)
presenter.setScrollingTileId(0)
expectStateUpdate presenter, -> presenter.setScrollTop(4)
expect(lineStateForScreenRow(presenter, 0)).toBeDefined()
expect(lineStateForScreenRow(presenter, 1)).toBeUndefined()
expect(lineStateForScreenRow(presenter, 7)).toBeDefined()
expect(lineStateForScreenRow(presenter, 8)).toBeUndefined()
expect(presenter.getState().content.tiles[0]).toBeDefined()
expect(presenter.getState().content.tiles[2]).toBeUndefined()
expect(presenter.getState().content.tiles[4]).toBeDefined()
expect(presenter.getState().content.tiles[12]).toBeUndefined()
expectStateUpdate presenter, -> advanceClock(200)
expect(lineStateForScreenRow(presenter, 0)).toBeUndefined()
expect(lineStateForScreenRow(presenter, 1)).toBeUndefined()
expect(lineStateForScreenRow(presenter, 2)).toBeDefined()
expect(lineStateForScreenRow(presenter, 7)).toBeDefined()
expect(lineStateForScreenRow(presenter, 8)).toBeUndefined()
expect(presenter.getState().content.tiles[0]).toBeUndefined()
expect(presenter.getState().content.tiles[2]).toBeUndefined()
expect(presenter.getState().content.tiles[4]).toBeDefined()
expect(presenter.getState().content.tiles[12]).toBeUndefined()
# should clear ::mouseWheelScreenRow after stoppedScrollingDelay elapses even if we don't scroll first
presenter.setMouseWheelScreenRow(2)
presenter.setScrollingTileId(4)
advanceClock(200)
expectStateUpdate presenter, -> presenter.setScrollTop(45)
expect(lineStateForScreenRow(presenter, 2)).toBeUndefined()
expectStateUpdate presenter, -> presenter.setScrollTop(6)
expect(presenter.getState().content.tiles[4]).toBeUndefined()
it "does not preserve on-screen lines even if they correspond to ::mouseWheelScreenRow", ->
presenter = buildPresenter(explicitHeight: 25, scrollTop: 0, lineHeight: 10, lineOverdrawMargin: 1, stoppedScrollingDelay: 200)
oldLine3 = editor.tokenizedLineForScreenRow(6)
it "does not preserve deleted on-screen tiles even if they correspond to ::scrollingTileId", ->
presenter = buildPresenter(explicitHeight: 6, scrollTop: 0, lineHeight: 1, tileCount: 3, stoppedScrollingDelay: 200)
presenter.setMouseWheelScreenRow(3)
presenter.setScrollingTileId(2)
expectStateUpdate presenter, -> editor.getBuffer().insert([3, Infinity], 'xyz')
newLine3 = editor.tokenizedLineForScreenRow(3)
expectStateUpdate presenter, -> editor.setText("")
expect(presenter.getState().content.lines[oldLine3.id]).toBeUndefined()
expect(presenter.getState().content.lines[newLine3.id]).toBeDefined()
expect(presenter.getState().content.tiles[2]).toBeUndefined()
expect(presenter.getState().content.tiles[0]).toBeDefined()
it "does not attempt to preserve lines corresponding to ::mouseWheelScreenRow if they have been deleted", ->
presenter = buildPresenter(explicitHeight: 25, scrollTop: 0, lineHeight: 10, lineOverdrawMargin: 1, stoppedScrollingDelay: 200)
presenter.setMouseWheelScreenRow(10)
editor.setText('')
describe "[lineId]", -> # line state objects
describe "[tileId].lines[lineId]", -> # line state objects
it "includes the .endOfLineInvisibles if the editor.showInvisibles config option is true", ->
editor.setText("hello\nworld\r\n")
presenter = buildPresenter(explicitHeight: 25, scrollTop: 0, lineHeight: 10)

View File

@@ -15,12 +15,11 @@ class TextEditorPresenter
constructor: (params) ->
{@model, @autoHeight, @explicitHeight, @contentFrameWidth, @scrollTop, @scrollLeft, @boundingClientRect, @windowWidth, @windowHeight, @gutterWidth} = params
{horizontalScrollbarHeight, verticalScrollbarWidth} = params
{@lineHeight, @baseCharacterWidth, @lineOverdrawMargin, @backgroundColor, @gutterBackgroundColor, @tileCount, @tileOverdrawMargin} = params
{@lineHeight, @baseCharacterWidth, @lineOverdrawMargin, @backgroundColor, @gutterBackgroundColor, @tileCount} = params
{@cursorBlinkPeriod, @cursorBlinkResumeDelay, @stoppedScrollingDelay, @focused} = params
@measuredHorizontalScrollbarHeight = horizontalScrollbarHeight
@measuredVerticalScrollbarWidth = verticalScrollbarWidth
@gutterWidth ?= 0
@tileOverdrawMargin ?= 0
@tileCount ?= 3
@disposables = new CompositeDisposable
@@ -306,10 +305,9 @@ class TextEditorPresenter
row - (row % @tileSize)
getVisibleTilesRange: ->
startTileRow = Math.max(0, @tileForRow(@startRow) - @tileOverdrawMargin)
startTileRow = Math.max(0, @tileForRow(@startRow))
endTileRow = Math.min(
@tileForRow(@model.getScreenLineCount()),
@tileForRow(@endRow) + @tileOverdrawMargin
@tileForRow(@model.getScreenLineCount()), @tileForRow(@endRow)
)
[startTileRow..endTileRow]
@@ -332,13 +330,15 @@ class TextEditorPresenter
visibleTiles[startRow] = true
if @scrollingTileId?
if @scrollingTileId <= @tileForRow(@model.getLastScreenRow())
visibleTiles[@scrollingTileId] = true
@state.content.tiles[@scrollingTileId].display = "none"
for id, tile of @state.content.tiles
continue if visibleTiles.hasOwnProperty(id)
if id is @scrollingTileId
tile.display = "none"
else
delete @state.content.tiles[id]
delete @state.content.tiles[id]
updateLinesState: (tileState, startRow, endRow) ->
tileState.lines ?= {}
@@ -943,6 +943,7 @@ class TextEditorPresenter
@emitDidUpdateState()
setScrollingTileId: (tileId) ->
tileId = tileId.toString()
if @scrollingTileId isnt tileId
@scrollingTileId = tileId
@didStartScrolling()