Skip to content

Commit

Permalink
Tests: Extract MockEditor, run, renderBuiltAbstract, docs for `…
Browse files Browse the repository at this point in the history
…buildFromText`
  • Loading branch information
bantic committed Aug 2, 2016
1 parent 92c3eb6 commit b473a27
Show file tree
Hide file tree
Showing 10 changed files with 175 additions and 258 deletions.
10 changes: 8 additions & 2 deletions src/js/editor/post.js
Expand Up @@ -145,7 +145,7 @@ class PostEditor {
// Grab the next leaf section before removing blank head
let nextHeadSection = section.nextLeafSection();

// Remove a blank head section
// Remove the blank head section now
this.removeSection(section);

// Advance the range and recursively delete it
Expand All @@ -157,15 +157,20 @@ class PostEditor {
case tailSection:
if (section.isCardSection) {
if (tail.isTail()) {
// If the range extends to the end of the tail section, remove it
removedSections.push(section);
}
} else {

// join the tail section's markers (afer `tailSectionOffset`) to
// the appendSection
section.markersFor(tailSectionOffset, section.text.length).forEach(marker => {
appendSection.markers.append(marker);
});

// If we've modified headSection, ensure it is marked dirty so that it is re-rendered.
// If appendSection !== headSection, it's a new section that will be rendered regardless.
if (appendSection === headSection) {
// If we've modified headSection, ensure it is marked dirty
this._markDirty(headSection);
}

Expand All @@ -179,6 +184,7 @@ class PostEditor {
});

if (recursiveRangeToDelete) {
// If we are recursing, return early here
return this.deleteRange(recursiveRangeToDelete);
}

Expand Down
24 changes: 24 additions & 0 deletions tests/helpers/mock-editor.js
@@ -0,0 +1,24 @@
import PostEditor from 'mobiledoc-kit/editor/post';
import Range from 'mobiledoc-kit/utils/cursor/range';

class MockEditor {
constructor(builder) {
this.builder = builder;
this.range = Range.blankRange();
}
run(callback) {
let postEditor = new PostEditor(this);
postEditor.begin();
let result = callback(postEditor);
postEditor.end();
return result;
}
rerender() {}
_postDidChange() {}
selectRange(range) {
this._renderedRange = range;
}
_readRangeFromDOM() {}
}

export default MockEditor;
21 changes: 18 additions & 3 deletions tests/helpers/post-abstract.js
Expand Up @@ -142,9 +142,24 @@ function parseSingleText(text, builder) {
}

/**
* usage:
* Helpers.postAbstract.buildFromText(text) -> { post } with 1 markupSection ("p") with text `text`
* Helpers.postAbstract.buildFromText([text1, text2]) -> { post } with 2 markupSections ("p") with texts `text1`, `text2`
* Shorthand to create a mobiledoc simply.
* Pass a string or an array of strings.
*
* Returns { post, range }, a post built from the mobiledoc and a range.
*
* Use "|" to indicate the cursor position or "<" and ">" to indicate a range.
* Use "[card-name]" to indicate a card
* Use asterisks to indicate bold text: "abc *bold* def"
* Use "@" to indicate an atom
* Use "* " at the start of the string to indicate a list item ("ul")
*
* Examples:
* buildFromText("abc") -> { post } with 1 markup section ("p") with text "abc"
* buildFromText(["abc","def"]) -> { post } with 2 markups sections ("p") with texts "abc" and "def"
* buildFromText("abc|def") -> { post, range } where range is collapsed at offset 3 (after the "c")
* buildFromText(["abcdef","[some-card]","def"]) -> { post } with [MarkupSection, Card, MarkupSection] sections
* buildFromText(["* item 1", "* item 2"]) -> { post } with a ListSection with 2 ListItems
* buildFromText(["<abc", "def", "ghi>"]) -> { post, range } where range is the entire post (before the "a" to after the "i")
*/
function buildFromText(texts) {
if (!Array.isArray(texts)) { texts = [texts]; }
Expand Down
18 changes: 18 additions & 0 deletions tests/helpers/post-editor-run.js
@@ -0,0 +1,18 @@
import PostNodeBuilder from 'mobiledoc-kit/models/post-node-builder';
import PostEditor from 'mobiledoc-kit/editor/post';
import MockEditor from './mock-editor';
import renderBuiltAbstract from './render-built-abstract';

export default function run(post, callback) {
let builder = new PostNodeBuilder();
let editor = new MockEditor(builder);

renderBuiltAbstract(post, editor);

let postEditor = new PostEditor(editor);
postEditor.begin();
let result = callback(postEditor);
postEditor.complete();
return result;
}

13 changes: 13 additions & 0 deletions tests/helpers/render-built-abstract.js
@@ -0,0 +1,13 @@
import EditorDomRenderer from 'mobiledoc-kit/renderers/editor-dom';
import RenderTree from 'mobiledoc-kit/models/render-tree';

export default function renderBuiltAbstract(post, editor) {
editor.post = post;
let unknownCardHandler = () => {};
let unknownAtomHandler = () => {};
let renderer = new EditorDomRenderer(
editor, [], [], unknownCardHandler, unknownAtomHandler);
let renderTree = new RenderTree(post);
renderer.render(renderTree);
return editor;
}
6 changes: 5 additions & 1 deletion tests/test-helpers.js
Expand Up @@ -6,6 +6,9 @@ import MobiledocHelpers from './helpers/mobiledoc';
import PostAbstract from './helpers/post-abstract';
import { detectIE11 } from './helpers/browsers';
import wait from './helpers/wait';
import MockEditor from './helpers/mock-editor';
import renderBuiltAbstract from './helpers/render-built-abstract';
import run from './helpers/post-editor-run';

const { test:qunitTest, module, skip } = QUnit;

Expand Down Expand Up @@ -45,5 +48,6 @@ export default {
test,
module,
skipInIE11,
wait
wait,
postEditor: { run, renderBuiltAbstract, MockEditor }
};
3 changes: 1 addition & 2 deletions tests/unit/editor/editor-test.js
Expand Up @@ -582,8 +582,7 @@ test('#insertCard inserts card at section after cursor position, replacing range
assert.equal(editor.post.sections.length, 3, 'replaced initial blank section with card');
assert.ok(editor.post.sections.head.isCardSection, 'initial section is card section');

let range = new Range(editor.post.headPosition(), editor.post.tailPosition());
editor.selectRange(range);
editor.selectRange(new Range(editor.post.headPosition(), editor.post.tailPosition()));
editor.insertCard('the-card');
assert.equal(editor.post.sections.length, 1, 'replaces range with card section');
assert.ok(editor.post.sections.head.isCardSection, 'initial section is card section');
Expand Down
70 changes: 3 additions & 67 deletions tests/unit/editor/post-delete-at-position-test.js
@@ -1,78 +1,14 @@
import EditorDomRenderer from 'mobiledoc-kit/renderers/editor-dom';
import RenderTree from 'mobiledoc-kit/models/render-tree';
import PostEditor from 'mobiledoc-kit/editor/post';
import Helpers from '../../test-helpers';
import PostNodeBuilder from 'mobiledoc-kit/models/post-node-builder';
import Range from 'mobiledoc-kit/utils/cursor/range';
import Position from 'mobiledoc-kit/utils/cursor/position';

import { DIRECTION } from 'mobiledoc-kit/utils/key';
const { FORWARD, BACKWARD } = DIRECTION;

const { module, test } = Helpers;

let editor, editorElement;

function renderBuiltAbstract(post, editor) {
editor.post = post;
let unknownCardHandler = () => {};
let unknownAtomHandler = () => {};
let renderer = new EditorDomRenderer(
editor, [], [], unknownCardHandler, unknownAtomHandler);
let renderTree = new RenderTree(post);
renderer.render(renderTree);
return editor;
}

let renderedRange;

class MockEditor {
constructor(builder) {
this.builder = builder;
this.range = Range.blankRange();
}
run(callback) {
let postEditor = new PostEditor(this);
postEditor.begin();
let result = callback(postEditor);
postEditor.end();
return result;
}
rerender() {}
_postDidChange() {}
selectRange(range) {
renderedRange = range;
}
_readRangeFromDOM() {}
}

let run = (post, callback) => {
let builder = new PostNodeBuilder();
let editor = new MockEditor(builder);

renderBuiltAbstract(post, editor);

let postEditor = new PostEditor(editor);
postEditor.begin();
let result = callback(postEditor);
postEditor.complete();
return result;
};

module('Unit: PostEditor: #deleteAtPosition', {
beforeEach() {
renderedRange = null;
editorElement = $('#editor')[0];
},

afterEach() {
renderedRange = null;
if (editor) {
editor.destroy();
editor = null;
}
}
});
let { postEditor: { run } } = Helpers;

module('Unit: PostEditor: #deleteAtPosition');

test('single markup section (backward)', (assert) => {
let examples = [
Expand Down
79 changes: 8 additions & 71 deletions tests/unit/editor/post-delete-range-test.js
@@ -1,75 +1,12 @@
import EditorDomRenderer from 'mobiledoc-kit/renderers/editor-dom';
import RenderTree from 'mobiledoc-kit/models/render-tree';
import PostEditor from 'mobiledoc-kit/editor/post';
import Helpers from '../../test-helpers';
import PostNodeBuilder from 'mobiledoc-kit/models/post-node-builder';
import Range from 'mobiledoc-kit/utils/cursor/range';
import { forEach } from 'mobiledoc-kit/utils/array-utils';

const { module, test } = Helpers;

let editor, editorElement;

function renderBuiltAbstract(post, editor) {
editor.post = post;
let unknownCardHandler = () => {};
let unknownAtomHandler = () => {};
let renderer = new EditorDomRenderer(
editor, [], [], unknownCardHandler, unknownAtomHandler);
let renderTree = new RenderTree(post);
renderer.render(renderTree);
return editor;
}

let renderedRange;

class MockEditor {
constructor(builder) {
this.builder = builder;
this.range = Range.blankRange();
}
run(callback) {
let postEditor = new PostEditor(this);
postEditor.begin();
let result = callback(postEditor);
postEditor.end();
return result;
}
rerender() {}
_postDidChange() {}
selectRange(range) {
renderedRange = range;
}
_readRangeFromDOM() {}
}

let run = (post, callback) => {
let builder = new PostNodeBuilder();
let editor = new MockEditor(builder);

renderBuiltAbstract(post, editor);

let postEditor = new PostEditor(editor);
postEditor.begin();
let result = callback(postEditor);
postEditor.complete();
return result;
};

module('Unit: PostEditor: #deleteRange', {
beforeEach() {
renderedRange = null;
editorElement = $('#editor')[0];
},

afterEach() {
renderedRange = null;
if (editor) {
editor.destroy();
editor = null;
}
}
});
let { postEditor: { run } } = Helpers;

module('Unit: PostEditor: #deleteRange');

test('#deleteRange with collapsed range is no-op', (assert) => {
let { post, range } = Helpers.postAbstract.buildFromText('abc|def');
Expand Down Expand Up @@ -166,7 +103,7 @@ test('#deleteRange across markup section boundaries', (assert) => {
let { post: expectedPost, range: expectedRange } = Helpers.postAbstract.buildFromText(after);

let position = run(post, postEditor => postEditor.deleteRange(range));
renderedRange = new Range(position);
let renderedRange = new Range(position);

expectedRange = Range.create(post.sections.head, expectedRange.head.offset);

Expand Down Expand Up @@ -203,7 +140,7 @@ test('#deleteRange across markup section boundaries including markups', (assert)
let { post: expectedPost, range: expectedRange } = Helpers.postAbstract.buildFromText(after);

let position = run(post, postEditor => postEditor.deleteRange(range));
renderedRange = new Range(position);
let renderedRange = new Range(position);

expectedRange = Range.create(post.sections.head, expectedRange.head.offset);

Expand Down Expand Up @@ -232,7 +169,7 @@ test('#deleteRange across markup/non-markup section boundaries', (assert) => {
let { post: expectedPost, range: expectedRange } = Helpers.postAbstract.buildFromText(after);

let position = run(post, postEditor => postEditor.deleteRange(range));
renderedRange = new Range(position);
let renderedRange = new Range(position);

// FIXME need to figure out how to say which section to expect the range to include
let sectionIndex;
Expand Down Expand Up @@ -273,7 +210,7 @@ test('#deleteRange across list items', (assert) => {
let { post: expectedPost, range: expectedRange } = Helpers.postAbstract.buildFromText(after);

let position = run(post, postEditor => postEditor.deleteRange(range));
renderedRange = new Range(position);
let renderedRange = new Range(position);

// FIXME need to figure out how to say which section to expect the range to include
let sectionIndex;
Expand Down Expand Up @@ -311,7 +248,7 @@ test('#deleteRange with atoms', (assert) => {
let { post: expectedPost, range: expectedRange } = Helpers.postAbstract.buildFromText(after);

let position = run(post, postEditor => postEditor.deleteRange(range));
renderedRange = new Range(position);
let renderedRange = new Range(position);

expectedRange = Range.create(post.sections.head, expectedRange.head.offset);

Expand Down

0 comments on commit b473a27

Please sign in to comment.