From 4b350598a5f8a4991d5383d1d58fb52c2fc71672 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 8 Feb 2012 14:25:47 -0700 Subject: [PATCH] WIP: Testing changes that cause lines to wrap --- spec/atom/line-wrapper-spec.coffee | 20 +++++++++++++++++++- src/atom/line-wrapper.coffee | 13 +++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/spec/atom/line-wrapper-spec.coffee b/spec/atom/line-wrapper-spec.coffee index b85bbdaff..e9fe76b4e 100644 --- a/spec/atom/line-wrapper-spec.coffee +++ b/spec/atom/line-wrapper-spec.coffee @@ -48,8 +48,9 @@ describe "LineWrapper", -> expect(screenLines[2].endColumn).toBe 65 expect(_.pluck(screenLines[2], 'value').join('')).toBe 'right.push(current);' - fdescribe "when the buffer changes", -> + describe "when the buffer changes", -> changeHandler = null + longText = '0123456789ABCDEF' beforeEach -> changeHandler = jasmine.createSpy('changeHandler') @@ -65,8 +66,25 @@ describe "LineWrapper", -> [event] = changeHandler.argsForCall[0] expect(event.oldRange).toEqual(new Range([0, 10], [0, 10])) expect(event.newRange).toEqual(new Range([0, 10], [0, 11])) + changeHandler.reset() + + # below a wrapped line + buffer.insert([4, 10], 'foo') + expect(tokensText(wrapper.tokensForScreenRow(5))).toContain 'fooitems' + expect(changeHandler).toHaveBeenCalled() + [event] = changeHandler.argsForCall[0] + expect(event.oldRange).toEqual(new Range([5, 10], [5, 10])) + expect(event.newRange).toEqual(new Range([5, 10], [5, 13])) + describe "when the update causes the line to wrap once", -> + fit "updates tokens for the corresponding screen lines and emits a change event", -> + buffer.insert([2, 4], longText) + expect(tokensText(wrapper.tokensForScreenRow(2))).toBe ' 0123456789ABCDEFif (items.length <= 1) return ' + expect(tokensText(wrapper.tokensForScreenRow(3))).toBe 'items;' + expect(tokensText(wrapper.tokensForScreenRow(4))).toBe ' var pivot = items.shift(), current, left = [], ' + + # LEFT OFF HERE: Test change event describe "when the update causes the line to wrap multiple times", -> diff --git a/src/atom/line-wrapper.coffee b/src/atom/line-wrapper.coffee index d9d494f0e..466472395 100644 --- a/src/atom/line-wrapper.coffee +++ b/src/atom/line-wrapper.coffee @@ -1,6 +1,7 @@ _ = require 'underscore' -Point = require 'point' EventEmitter = require 'event-emitter' +Point = require 'point' +Range = require 'range' getWordRegex = -> /\b[^\s]+/g @@ -11,7 +12,9 @@ class LineWrapper @buildWrappedLines() @highlighter.on 'change', (e) => @wrappedLines[e.oldRange.start.row] = @buildWrappedLineForBufferRow(e.newRange.start.row) - @trigger 'change', e + oldRange = @screenRangeFromBufferRange(e.oldRange) + newRange = @screenRangeFromBufferRange(e.newRange) + @trigger 'change', { oldRange, newRange } setMaxLength: (@maxLength) -> @buildWrappedLines() @@ -58,6 +61,12 @@ class LineWrapper { screenLines } + + screenRangeFromBufferRange: (bufferRange) -> + start = @screenPositionFromBufferPosition(bufferRange.start) + end = @screenPositionFromBufferPosition(bufferRange.end) + new Range(start,end) + screenPositionFromBufferPosition: (bufferPosition) -> bufferPosition = Point.fromObject(bufferPosition) row = 0