CommandInterpreter uses project and edit sessions instead of editor to execute

We don't want to pass view objects into it!
This commit is contained in:
Corey Johnson & Nathan Sobo
2012-07-13 15:10:37 -06:00
parent a4db677979
commit 42f322a112
13 changed files with 141 additions and 143 deletions

View File

@@ -1,76 +1,74 @@
CommandInterpreter = require 'command-panel/command-interpreter'
Buffer = require 'buffer'
EditSession = require 'edit-session'
Editor = require 'editor'
describe "CommandInterpreter", ->
[interpreter, editor, buffer] = []
[interpreter, editSession, buffer] = []
beforeEach ->
interpreter = new CommandInterpreter(fixturesProject)
editSession = fixturesProject.open('sample.js')
buffer = editSession.buffer
editor = new Editor(editSession: editSession)
interpreter = new CommandInterpreter()
afterEach ->
editor.remove()
editSession.destroy()
describe "addresses", ->
beforeEach ->
editor.addSelectionForBufferRange([[7,0], [7,11]])
editor.addSelectionForBufferRange([[8,0], [8,11]])
editSession.addSelectionForBufferRange([[7,0], [7,11]])
editSession.addSelectionForBufferRange([[8,0], [8,11]])
describe "a line address", ->
it "selects the specified line", ->
interpreter.eval(editor, '4')
expect(editor.getSelections().length).toBe 1
expect(editor.getSelection().getBufferRange()).toEqual [[3, 0], [4, 0]]
interpreter.eval('4', editSession)
expect(editSession.getSelections().length).toBe 1
expect(editSession.getSelection().getBufferRange()).toEqual [[3, 0], [4, 0]]
describe "0", ->
it "selects the zero-length string at the start of the file", ->
interpreter.eval(editor, '0')
expect(editor.getSelections().length).toBe 1
expect(editor.getSelection().getBufferRange()).toEqual [[0,0], [0,0]]
interpreter.eval('0', editSession)
expect(editSession.getSelections().length).toBe 1
expect(editSession.getSelection().getBufferRange()).toEqual [[0,0], [0,0]]
interpreter.eval(editor, '0,1')
expect(editor.getSelections().length).toBe 1
expect(editor.getSelection().getBufferRange()).toEqual [[0,0], [1,0]]
interpreter.eval('0,1', editSession)
expect(editSession.getSelections().length).toBe 1
expect(editSession.getSelection().getBufferRange()).toEqual [[0,0], [1,0]]
describe "$", ->
it "selects EOF", ->
interpreter.eval(editor, '$')
expect(editor.getSelections().length).toBe 1
expect(editor.getSelection().getBufferRange()).toEqual [[12,2], [12,2]]
interpreter.eval('$', editSession)
expect(editSession.getSelections().length).toBe 1
expect(editSession.getSelection().getBufferRange()).toEqual [[12,2], [12,2]]
interpreter.eval(editor, '1,$')
expect(editor.getSelections().length).toBe 1
expect(editor.getSelection().getBufferRange()).toEqual [[0,0], [12,2]]
interpreter.eval('1,$', editSession)
expect(editSession.getSelections().length).toBe 1
expect(editSession.getSelection().getBufferRange()).toEqual [[0,0], [12,2]]
describe ".", ->
describe "when a single selection", ->
it 'maintains the current selection', ->
editor.clearSelections()
editor.setSelectedBufferRange([[1,1], [2,2]])
interpreter.eval(editor, '.')
expect(editor.getSelection().getBufferRange()).toEqual [[1,1], [2,2]]
editSession.clearSelections()
editSession.setSelectedBufferRange([[1,1], [2,2]])
interpreter.eval('.', editSession)
expect(editSession.getSelection().getBufferRange()).toEqual [[1,1], [2,2]]
editor.setSelectedBufferRange([[1,1], [2,2]])
interpreter.eval(editor, '.,')
expect(editor.getSelection().getBufferRange()).toEqual [[1,1], [12,2]]
editSession.setSelectedBufferRange([[1,1], [2,2]])
interpreter.eval('.,', editSession)
expect(editSession.getSelection().getBufferRange()).toEqual [[1,1], [12,2]]
editor.setSelectedBufferRange([[1,1], [2,2]])
interpreter.eval(editor, ',.')
expect(editor.getSelection().getBufferRange()).toEqual [[0,0], [2,2]]
editSession.setSelectedBufferRange([[1,1], [2,2]])
interpreter.eval(',.', editSession)
expect(editSession.getSelection().getBufferRange()).toEqual [[0,0], [2,2]]
describe "with multiple selections", ->
it "maintains the current selections", ->
preSelections = editor.getSelections()
preSelections = editSession.getSelections()
expect(preSelections.length).toBe 3
[preRange1, preRange2, preRange3] = preSelections.map (s) -> s.getScreenRange()
interpreter.eval(editor, '.')
interpreter.eval('.', editSession)
selections = editor.getSelections()
selections = editSession.getSelections()
expect(selections.length).toBe 3
[selection1, selection2, selection3] = selections
expect(selection1.getScreenRange()).toEqual preRange1
@@ -79,72 +77,72 @@ describe "CommandInterpreter", ->
describe "/regex/", ->
beforeEach ->
editor.clearSelections()
editSession.clearSelections()
it 'selects text matching regex after current selection', ->
editor.setSelectedBufferRange([[4,16], [4,20]])
interpreter.eval(editor, '/pivot/')
expect(editor.getSelection().getBufferRange()).toEqual [[6,16], [6,21]]
editSession.setSelectedBufferRange([[4,16], [4,20]])
interpreter.eval('/pivot/', editSession)
expect(editSession.getSelection().getBufferRange()).toEqual [[6,16], [6,21]]
it 'does not require the trailing slash', ->
editor.setSelectedBufferRange([[4,16], [4,20]])
interpreter.eval(editor, '/pivot')
expect(editor.getSelection().getBufferRange()).toEqual [[6,16], [6,21]]
editSession.setSelectedBufferRange([[4,16], [4,20]])
interpreter.eval('/pivot', editSession)
expect(editSession.getSelection().getBufferRange()).toEqual [[6,16], [6,21]]
it "searches from the end of each selection in the buffer", ->
editor.clearSelections()
editor.setSelectedBufferRange([[4,16], [4,20]])
editor.addSelectionForBufferRange([[1,16], [2,20]])
expect(editor.getSelections().length).toBe 2
interpreter.eval(editor, '/pivot')
selections = editor.getSelections()
editSession.clearSelections()
editSession.setSelectedBufferRange([[4,16], [4,20]])
editSession.addSelectionForBufferRange([[1,16], [2,20]])
expect(editSession.getSelections().length).toBe 2
interpreter.eval('/pivot', editSession)
selections = editSession.getSelections()
expect(selections.length).toBe 2
expect(selections[0].getBufferRange()).toEqual [[3,8], [3,13]]
expect(selections[1].getBufferRange()).toEqual [[6,16], [6,21]]
it "wraps around to the beginning of the buffer, but doesn't infinitely loop if no matches are found", ->
editor.setSelectedBufferRange([[10, 0], [10,3]])
interpreter.eval(editor, '/pivot')
expect(editor.getSelection().getBufferRange()).toEqual [[3,8], [3,13]]
editSession.setSelectedBufferRange([[10, 0], [10,3]])
interpreter.eval('/pivot', editSession)
expect(editSession.getSelection().getBufferRange()).toEqual [[3,8], [3,13]]
interpreter.eval(editor, '/mike tyson')
expect(editor.getSelection().getBufferRange()).toEqual [[3,8], [3,13]]
interpreter.eval('/mike tyson', editSession)
expect(editSession.getSelection().getBufferRange()).toEqual [[3,8], [3,13]]
it "searches in reverse when prefixed with a -", ->
editor.setSelectedBufferRange([[6, 16], [6, 22]])
interpreter.eval(editor, '-/pivot')
expect(editor.getSelection().getBufferRange()).toEqual [[3,8], [3,13]]
editSession.setSelectedBufferRange([[6, 16], [6, 22]])
interpreter.eval('-/pivot', editSession)
expect(editSession.getSelection().getBufferRange()).toEqual [[3,8], [3,13]]
describe "address range", ->
describe "when two addresses are specified", ->
it "selects from the begining of the left address to the end of the right address", ->
interpreter.eval(editor, '4,7')
expect(editor.getSelections().length).toBe 1
expect(editor.getSelection().getBufferRange()).toEqual [[3, 0], [7, 0]]
interpreter.eval('4,7', editSession)
expect(editSession.getSelections().length).toBe 1
expect(editSession.getSelection().getBufferRange()).toEqual [[3, 0], [7, 0]]
describe "when the left address is unspecified", ->
it "selects from the begining of buffer to the end of the right address", ->
interpreter.eval(editor, ',7')
expect(editor.getSelections().length).toBe 1
expect(editor.getSelection().getBufferRange()).toEqual [[0, 0], [7, 0]]
interpreter.eval(',7', editSession)
expect(editSession.getSelections().length).toBe 1
expect(editSession.getSelection().getBufferRange()).toEqual [[0, 0], [7, 0]]
describe "when the right address is unspecified", ->
it "selects from the begining of left address to the end file", ->
interpreter.eval(editor, '4,')
expect(editor.getSelections().length).toBe 1
expect(editor.getSelection().getBufferRange()).toEqual [[3, 0], [12, 2]]
interpreter.eval('4,', editSession)
expect(editSession.getSelections().length).toBe 1
expect(editSession.getSelection().getBufferRange()).toEqual [[3, 0], [12, 2]]
describe "when the neither address is specified", ->
it "selects the entire file", ->
interpreter.eval(editor, ',')
expect(editor.getSelections().length).toBe 1
expect(editor.getSelection().getBufferRange()).toEqual [[0, 0], [12, 2]]
interpreter.eval(',', editSession)
expect(editSession.getSelections().length).toBe 1
expect(editSession.getSelection().getBufferRange()).toEqual [[0, 0], [12, 2]]
describe "x/regex/", ->
it "sets the current selection to every match of the regex in the current selection", ->
interpreter.eval(editor, '6,7 x/current/')
interpreter.eval('6,7 x/current/', editSession)
selections = editor.getSelections()
selections = editSession.getSelections()
expect(selections.length).toBe 4
expect(selections[0].getBufferRange()).toEqual [[5,6], [5,13]]
@@ -154,9 +152,9 @@ describe "CommandInterpreter", ->
describe "when matching /$/", ->
it "matches the end of each line in the selected region", ->
interpreter.eval(editor, '6,8 x/$/')
interpreter.eval('6,8 x/$/', editSession)
cursors = editor.getCursors()
cursors = editSession.getCursors()
expect(cursors.length).toBe 3
expect(cursors[0].getBufferPosition()).toEqual [5, 30]
@@ -164,12 +162,12 @@ describe "CommandInterpreter", ->
expect(cursors[2].getBufferPosition()).toEqual [7, 5]
it "loops through current selections and selects text matching the regex", ->
editor.setSelectedBufferRange [[3,0], [3,62]]
editor.addSelectionForBufferRange [[6,0], [6,65]]
editSession.setSelectedBufferRange [[3,0], [3,62]]
editSession.addSelectionForBufferRange [[6,0], [6,65]]
interpreter.eval(editor, 'x/current')
interpreter.eval('x/current', editSession)
selections = editor.getSelections()
selections = editSession.getSelections()
expect(selections.length).toBe 4
expect(selections[0].getBufferRange()).toEqual [[3,31], [3,38]]
@@ -179,35 +177,35 @@ describe "CommandInterpreter", ->
describe "substitution", ->
it "does nothing if there are no matches", ->
editor.setSelectedBufferRange([[6, 0], [6, 44]])
interpreter.eval(editor, 's/not-in-text/foo/')
editSession.setSelectedBufferRange([[6, 0], [6, 44]])
interpreter.eval('s/not-in-text/foo/', editSession)
expect(buffer.lineForRow(6)).toBe ' current < pivot ? left.push(current) : right.push(current);'
describe "when not global", ->
describe "when there is a single selection", ->
it "performs a single substitution within the current selection", ->
editor.setSelectedBufferRange([[6, 0], [6, 44]])
interpreter.eval(editor, 's/current/foo/')
editSession.setSelectedBufferRange([[6, 0], [6, 44]])
interpreter.eval('s/current/foo/', editSession)
expect(buffer.lineForRow(6)).toBe ' foo < pivot ? left.push(current) : right.push(current);'
describe "when there are multiple selections", ->
it "performs a single substitutions within each of the selections", ->
editor.setSelectedBufferRange([[5, 0], [5, 20]])
editor.addSelectionForBufferRange([[6, 0], [6, 44]])
editSession.setSelectedBufferRange([[5, 0], [5, 20]])
editSession.addSelectionForBufferRange([[6, 0], [6, 44]])
interpreter.eval(editor, 's/current/foo/')
interpreter.eval('s/current/foo/', editSession)
expect(buffer.lineForRow(5)).toBe ' foo = items.shift();'
expect(buffer.lineForRow(6)).toBe ' foo < pivot ? left.push(current) : right.push(current);'
describe "when global", ->
it "performs a multiple substitutions within the current selection", ->
editor.setSelectedBufferRange([[6, 0], [6, 44]])
interpreter.eval(editor, 's/current/foo/g')
editSession.setSelectedBufferRange([[6, 0], [6, 44]])
interpreter.eval('s/current/foo/g', editSession)
expect(buffer.lineForRow(6)).toBe ' foo < pivot ? left.push(foo) : right.push(current);'
describe "when prefixed with an address", ->
it "only makes substitutions within given lines", ->
interpreter.eval(editor, '4,6s/ /!/g')
interpreter.eval('4,6s/ /!/g', editSession)
expect(buffer.lineForRow(2)).toBe ' if (items.length <= 1) return items;'
expect(buffer.lineForRow(3)).toBe '!!!!var!pivot!=!items.shift(),!current,!left!=![],!right!=![];'
expect(buffer.lineForRow(4)).toBe '!!!!while(items.length!>!0)!{'
@@ -216,7 +214,7 @@ describe "CommandInterpreter", ->
describe "when matching $", ->
it "matches the end of each line and avoids infinitely looping on a zero-width match", ->
interpreter.eval(editor, ',s/$/!!!/g')
interpreter.eval(',s/$/!!!/g', editSession)
expect(buffer.lineForRow(0)).toBe 'var quicksort = function () {!!!'
expect(buffer.lineForRow(2)).toBe ' if (items.length <= 1) return items;!!!'
expect(buffer.lineForRow(6)).toBe ' current < pivot ? left.push(current) : right.push(current);!!!'
@@ -224,7 +222,7 @@ describe "CommandInterpreter", ->
describe "when matching ^", ->
it "matches the beginning of each line and avoids infinitely looping on a zero-width match", ->
interpreter.eval(editor, ',s/^/!!!/g')
interpreter.eval(',s/^/!!!/g', editSession)
expect(buffer.lineForRow(0)).toBe '!!!var quicksort = function () {'
expect(buffer.lineForRow(2)).toBe '!!! if (items.length <= 1) return items;'
expect(buffer.lineForRow(6)).toBe '!!! current < pivot ? left.push(current) : right.push(current);'
@@ -232,27 +230,27 @@ describe "CommandInterpreter", ->
describe "when there are multiple selections", ->
it "performs a multiple substitutions within each of the selections", ->
editor.setSelectedBufferRange([[5, 0], [5, 20]])
editor.addSelectionForBufferRange([[6, 0], [6, 44]])
editSession.setSelectedBufferRange([[5, 0], [5, 20]])
editSession.addSelectionForBufferRange([[6, 0], [6, 44]])
interpreter.eval(editor, 's/current/foo/g')
interpreter.eval('s/current/foo/g', editSession)
expect(buffer.lineForRow(5)).toBe ' foo = items.shift();'
expect(buffer.lineForRow(6)).toBe ' foo < pivot ? left.push(foo) : right.push(current);'
describe "when prefixed with an address", ->
it "restores the original selections upon completion if it is the last command", ->
editor.setSelectedBufferRanges([[[5, 0], [5, 20]], [[6, 0], [6, 44]]])
interpreter.eval(editor, ',s/current/foo/g')
expect(editor.getSelectedBufferRanges()).toEqual [[[5, 0], [5, 16]], [[6, 0], [6, 36]]]
editSession.setSelectedBufferRanges([[[5, 0], [5, 20]], [[6, 0], [6, 44]]])
interpreter.eval(',s/current/foo/g', editSession)
expect(editSession.getSelectedBufferRanges()).toEqual [[[5, 0], [5, 16]], [[6, 0], [6, 36]]]
describe "when command selects folded text", ->
it "unfolds lines that command selects", ->
editor.createFold(1, 9)
editor.createFold(5, 8)
editor.setSelectedBufferRange([[0,0], [0,0]])
editSession.createFold(1, 9)
editSession.createFold(5, 8)
editSession.setSelectedBufferRange([[0,0], [0,0]])
interpreter.eval(editor, '/push/')
expect(editor.getSelection().getBufferRange()).toEqual [[6,29], [6,33]]
expect(editor.lineForScreenRow(1).fold).toBeUndefined()
expect(editor.lineForScreenRow(5).fold).toBeUndefined()
expect(editor.lineForScreenRow(6).text).toBe buffer.lineForRow(6)
interpreter.eval('/push/', editSession)
expect(editSession.getSelection().getBufferRange()).toEqual [[6,29], [6,33]]
expect(editSession.lineForScreenRow(1).fold).toBeUndefined()
expect(editSession.lineForScreenRow(5).fold).toBeUndefined()
expect(editSession.lineForScreenRow(6).text).toBe buffer.lineForRow(6)