From 677df675fb8a761c3e01ddbd7d4466d3e4e7fb80 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 31 Jan 2012 19:28:25 -0700 Subject: [PATCH] :lipstick: reorganize editor spec a bit --- spec/atom/editor-spec.coffee | 254 ++++++++++++++++++----------------- src/atom/editor.coffee | 6 +- 2 files changed, 133 insertions(+), 127 deletions(-) diff --git a/spec/atom/editor-spec.coffee b/spec/atom/editor-spec.coffee index d28c18521..adc408929 100644 --- a/spec/atom/editor-spec.coffee +++ b/spec/atom/editor-spec.coffee @@ -15,39 +15,16 @@ describe "Editor", -> editor.enableKeymap() editor.setBuffer(buffer) - describe ".setBuffer", -> - it "creates a pre element for each line in the buffer, with the html-escaped text of the line", -> + describe "text rendering", -> + it "creates a pre element for each line in the buffer with the html-escaped text of the line", -> expect(editor.lines.find('pre').length).toEqual(buffer.numLines()) expect(buffer.getLine(2)).toContain('<') expect(editor.lines.find('pre:eq(2)').html()).toContain '<' - it "renders a non-breaking space for empty lines", -> + # renders empty lines with a non breaking space expect(buffer.getLine(10)).toBe '' expect(editor.lines.find('pre:eq(10)').html()).toBe ' ' - it "sets the cursor to the beginning of the file", -> - expect(editor.getCursorPosition()).toEqual(row: 0, column: 0) - - describe "when the editor is attached to the dom", -> - it "updates the pixel position of the cursor", -> - editor.setCursorPosition(row: 2, column: 2) - - editor.attachToDom() - - expect(editor.getCursor().position().top).toBe(2 * editor.lineHeight) - expect(editor.getCursor().position().left).toBe(2 * editor.charWidth) - - it "is focused", -> - editor.attachToDom() - expect(editor).toMatchSelector ":has(:focus)" - - describe "when the editor is focused", -> - it "focuses the hidden input", -> - editor.attachToDom() - editor.focus() - expect(editor).not.toMatchSelector ':focus' - expect(editor.hiddenInput).toMatchSelector ':focus' - describe "cursor movement", -> describe ".setCursorPosition({row, column})", -> beforeEach -> @@ -280,7 +257,7 @@ describe "Editor", -> expect(editor.getCursorPosition()).toEqual(row: 3, column: 10) - describe "selection bindings", -> + describe "selection", -> selection = null beforeEach -> @@ -374,129 +351,158 @@ describe "Editor", -> expect(range.end).toEqual({row: 5, column: 27}) expect(editor.getCursorPosition()).toEqual(row: 5, column: 27) - describe "when text input events are triggered on the hidden input element", -> - describe "when there is no selection", -> - it "inserts the typed character at the cursor position, both in the buffer and the pre element", -> - editor.setCursorPosition(row: 1, column: 6) + describe "buffer manipulation", -> + describe "when text input events are triggered on the hidden input element", -> + describe "when there is no selection", -> + it "inserts the typed character at the cursor position, both in the buffer and the pre element", -> + editor.setCursorPosition(row: 1, column: 6) - expect(editor.getCurrentLine().charAt(6)).not.toBe 'q' + expect(editor.getCurrentLine().charAt(6)).not.toBe 'q' - editor.hiddenInput.textInput 'q' + editor.hiddenInput.textInput 'q' - expect(editor.getCurrentLine().charAt(6)).toBe 'q' - expect(editor.getCursorPosition()).toEqual(row: 1, column: 7) - expect(editor.lines.find('pre:eq(1)')).toHaveText editor.getCurrentLine() + expect(editor.getCurrentLine().charAt(6)).toBe 'q' + expect(editor.getCursorPosition()).toEqual(row: 1, column: 7) + expect(editor.lines.find('pre:eq(1)')).toHaveText editor.getCurrentLine() - describe "when there is a selection", -> - it "replaces the selected text with the typed text", -> - editor.selection.setRange(new Range([1, 6], [2, 4])) - editor.hiddenInput.textInput 'q' - expect(buffer.getLine(1)).toBe ' var qif (items.length <= 1) return items;' + describe "when there is a selection", -> + it "replaces the selected text with the typed text", -> + editor.selection.setRange(new Range([1, 6], [2, 4])) + editor.hiddenInput.textInput 'q' + expect(buffer.getLine(1)).toBe ' var qif (items.length <= 1) return items;' - describe "when return is pressed", -> - describe "when the cursor is at the beginning of a line", -> - it "inserts an empty line before it", -> - editor.setCursorPosition(row: 1, column: 0) + describe "when return is pressed", -> + describe "when the cursor is at the beginning of a line", -> + it "inserts an empty line before it", -> + editor.setCursorPosition(row: 1, column: 0) - editor.trigger keydownEvent('enter') + editor.trigger keydownEvent('enter') - expect(editor.lines.find('pre:eq(1)')).toHaveHtml ' ' - expect(editor.getCursorPosition()).toEqual(row: 2, column: 0) + expect(editor.lines.find('pre:eq(1)')).toHaveHtml ' ' + expect(editor.getCursorPosition()).toEqual(row: 2, column: 0) - describe "when the cursor is in the middle of a line", -> - it "splits the current line to form a new line", -> - editor.setCursorPosition(row: 1, column: 6) + describe "when the cursor is in the middle of a line", -> + it "splits the current line to form a new line", -> + editor.setCursorPosition(row: 1, column: 6) - originalLine = editor.lines.find('pre:eq(1)').text() - lineBelowOriginalLine = editor.lines.find('pre:eq(2)').text() - editor.trigger keydownEvent('enter') + originalLine = editor.lines.find('pre:eq(1)').text() + lineBelowOriginalLine = editor.lines.find('pre:eq(2)').text() + editor.trigger keydownEvent('enter') - expect(editor.lines.find('pre:eq(1)')).toHaveText originalLine[0...6] - expect(editor.lines.find('pre:eq(2)')).toHaveText originalLine[6..] - expect(editor.lines.find('pre:eq(3)')).toHaveText lineBelowOriginalLine - expect(editor.getCursorPosition()).toEqual(row: 2, column: 0) + expect(editor.lines.find('pre:eq(1)')).toHaveText originalLine[0...6] + expect(editor.lines.find('pre:eq(2)')).toHaveText originalLine[6..] + expect(editor.lines.find('pre:eq(3)')).toHaveText lineBelowOriginalLine + expect(editor.getCursorPosition()).toEqual(row: 2, column: 0) - describe "when the cursor is on the end of a line", -> - it "inserts an empty line after it", -> - editor.setCursorPosition(row: 1, column: buffer.getLine(1).length) + describe "when the cursor is on the end of a line", -> + it "inserts an empty line after it", -> + editor.setCursorPosition(row: 1, column: buffer.getLine(1).length) - editor.trigger keydownEvent('enter') + editor.trigger keydownEvent('enter') - expect(editor.lines.find('pre:eq(2)')).toHaveHtml ' ' - expect(editor.getCursorPosition()).toEqual(row: 2, column: 0) + expect(editor.lines.find('pre:eq(2)')).toHaveHtml ' ' + expect(editor.getCursorPosition()).toEqual(row: 2, column: 0) - describe "when backspace is pressed", -> - describe "when the cursor is on the middle of the line", -> - it "removes the character before the cursor", -> - editor.setCursorPosition(row: 1, column: 7) - expect(buffer.getLine(1)).toBe " var sort = function(items) {" + describe "when backspace is pressed", -> + describe "when the cursor is on the middle of the line", -> + it "removes the character before the cursor", -> + editor.setCursorPosition(row: 1, column: 7) + expect(buffer.getLine(1)).toBe " var sort = function(items) {" - editor.trigger keydownEvent('backspace') + editor.trigger keydownEvent('backspace') - line = buffer.getLine(1) - expect(line).toBe " var ort = function(items) {" - expect(editor.lines.find('pre:eq(1)')).toHaveText line - expect(editor.getCursorPosition()).toEqual {row: 1, column: 6} + line = buffer.getLine(1) + expect(line).toBe " var ort = function(items) {" + expect(editor.lines.find('pre:eq(1)')).toHaveText line + expect(editor.getCursorPosition()).toEqual {row: 1, column: 6} - describe "when the cursor is at the beginning of a line", -> - it "joins it with the line above", -> - originalLine0 = buffer.getLine(0) - expect(originalLine0).toBe "var quicksort = function () {" - expect(buffer.getLine(1)).toBe " var sort = function(items) {" + describe "when the cursor is at the beginning of a line", -> + it "joins it with the line above", -> + originalLine0 = buffer.getLine(0) + expect(originalLine0).toBe "var quicksort = function () {" + expect(buffer.getLine(1)).toBe " var sort = function(items) {" - editor.setCursorPosition(row: 1, column: 0) - editor.trigger keydownEvent('backspace') + editor.setCursorPosition(row: 1, column: 0) + editor.trigger keydownEvent('backspace') - line0 = buffer.getLine(0) - line1 = buffer.getLine(1) - expect(line0).toBe "var quicksort = function () { var sort = function(items) {" - expect(line1).toBe " if (items.length <= 1) return items;" + line0 = buffer.getLine(0) + line1 = buffer.getLine(1) + expect(line0).toBe "var quicksort = function () { var sort = function(items) {" + expect(line1).toBe " if (items.length <= 1) return items;" - expect(editor.lines.find('pre:eq(0)')).toHaveText line0 - expect(editor.lines.find('pre:eq(1)')).toHaveText line1 - expect(editor.getCursorPosition()).toEqual {row: 0, column: originalLine0.length} + expect(editor.lines.find('pre:eq(0)')).toHaveText line0 + expect(editor.lines.find('pre:eq(1)')).toHaveText line1 + expect(editor.getCursorPosition()).toEqual {row: 0, column: originalLine0.length} - describe "when the cursor is at the first column of the first line", -> - it "does nothing, but doesn't raise an error", -> - editor.setCursorPosition(row: 0, column: 0) - editor.trigger keydownEvent('backspace') + describe "when the cursor is at the first column of the first line", -> + it "does nothing, but doesn't raise an error", -> + editor.setCursorPosition(row: 0, column: 0) + editor.trigger keydownEvent('backspace') - describe "when there is a selection", -> - it "deletes the selection, but not the character before it", -> - editor.selection.setRange(new Range([0,5], [0,9])) - editor.trigger keydownEvent('backspace') - expect(editor.buffer.getLine(0)).toBe 'var qsort = function () {' + describe "when there is a selection", -> + it "deletes the selection, but not the character before it", -> + editor.selection.setRange(new Range([0,5], [0,9])) + editor.trigger keydownEvent('backspace') + expect(editor.buffer.getLine(0)).toBe 'var qsort = function () {' - describe "when delete is pressed", -> - describe "when the cursor is on the middle of a line", -> - it "deletes the character following the cursor", -> - editor.setCursorPosition([1, 6]) - editor.trigger keydownEvent('delete') - expect(buffer.getLine(1)).toBe ' var ort = function(items) {' + describe "when delete is pressed", -> + describe "when the cursor is on the middle of a line", -> + it "deletes the character following the cursor", -> + editor.setCursorPosition([1, 6]) + editor.trigger keydownEvent('delete') + expect(buffer.getLine(1)).toBe ' var ort = function(items) {' - describe "when the cursor is on the end of a line", -> - it "joins the line with the following line", -> - editor.setCursorPosition([1, buffer.getLine(1).length]) - editor.trigger keydownEvent('delete') - expect(buffer.getLine(1)).toBe ' var sort = function(items) { if (items.length <= 1) return items;' + describe "when the cursor is on the end of a line", -> + it "joins the line with the following line", -> + editor.setCursorPosition([1, buffer.getLine(1).length]) + editor.trigger keydownEvent('delete') + expect(buffer.getLine(1)).toBe ' var sort = function(items) { if (items.length <= 1) return items;' - describe "when there is a selection", -> - it "deletes the selection, but not the character following it", -> - editor.selection.setRange(new Range([1,6], [1,8])) - editor.trigger keydownEvent 'delete' - expect(buffer.getLine(1)).toBe ' var rt = function(items) {' + describe "when there is a selection", -> + it "deletes the selection, but not the character following it", -> + editor.selection.setRange(new Range([1,6], [1,8])) + editor.trigger keydownEvent 'delete' + expect(buffer.getLine(1)).toBe ' var rt = function(items) {' - describe "when the cursor is on the last column of the last line", -> - it "does nothing, but doesn't raise an error", -> - editor.setCursorPosition([12, buffer.getLine(12).length]) - editor.trigger keydownEvent('delete') - expect(buffer.getLine(12)).toBe '};' + describe "when the cursor is on the last column of the last line", -> + it "does nothing, but doesn't raise an error", -> + editor.setCursorPosition([12, buffer.getLine(12).length]) + editor.trigger keydownEvent('delete') + expect(buffer.getLine(12)).toBe '};' - describe "when multiple lines are removed from the buffer (regression)", -> - it "removes all of them from the dom", -> - buffer.change(new Range([6, 24], [12, 0]), '') - expect(editor.find('.line').length).toBe 7 - expect(editor.find('.line:eq(6)').text()).toBe(buffer.getLine(6)) + describe "when multiple lines are removed from the buffer (regression)", -> + it "removes all of them from the dom", -> + buffer.change(new Range([6, 24], [12, 0]), '') + expect(editor.find('.line').length).toBe 7 + expect(editor.find('.line:eq(6)').text()).toBe(buffer.getLine(6)) + + describe "when the editor is attached to the dom", -> + it "calculates line height and char width and updates the pixel position of the cursor", -> + expect(editor.lineHeight).toBeNull() + expect(editor.charWidth).toBeNull() + editor.setCursorPosition(row: 2, column: 2) + + editor.attachToDom() + + expect(editor.lineHeight).not.toBeNull() + expect(editor.charWidth).not.toBeNull() + expect(editor.getCursor().position().top).toBe(2 * editor.lineHeight) + expect(editor.getCursor().position().left).toBe(2 * editor.charWidth) + + it "is focused", -> + editor.attachToDom() + expect(editor).toMatchSelector ":has(:focus)" + + describe "when the editor is focused", -> + it "focuses the hidden input", -> + editor.attachToDom() + editor.focus() + expect(editor).not.toMatchSelector ':focus' + expect(editor.hiddenInput).toMatchSelector ':focus' + + describe ".setBuffer(buffer)", -> + it "sets the cursor to the beginning of the file", -> + expect(editor.getCursorPosition()).toEqual(row: 0, column: 0) describe ".clipPosition(point)", -> it "selects the nearest valid position to the given point", -> @@ -506,5 +512,3 @@ describe "Editor", -> expect(editor.clipPosition(row: 1, column: -5)).toEqual(row: 1, column: 0) - - diff --git a/src/atom/editor.coffee b/src/atom/editor.coffee index 5ef8f7756..a871ab29d 100644 --- a/src/atom/editor.coffee +++ b/src/atom/editor.coffee @@ -15,11 +15,13 @@ class Editor extends Template @input class: 'hidden-input', outlet: 'hiddenInput' viewProperties: + vScrollMargin: 2 + hScrollMargin: 10 cursor: null buffer: null selection: null - vScrollMargin: 2 - hScrollMargin: 10 + lineHeight: null + charWidth: null initialize: () -> requireStylesheet 'editor.css'