/*global unexpected, describe, afterEach, beforeEach, it, Squire */
(function () {
'use strict';
var expect = unexpected.clone()
.installPlugin(unexpected.dom)
.addType({
name: 'SquireRTE',
base: 'object',
identify: function (value) {
return value instanceof Squire;
},
inspect: function (value, depth, output) {
return output.text('Squire RTE: ').code(value.getHTML(), 'html');
}
})
.addAssertion('SquireRTE', '[not] to contain HTML', function (expect, editor, expectedValue) {
expect.errorMode ='nested';
// BR tags are inconsistent across browsers. Removing them allows cross-browser testing.
expect(editor.getHTML().replace(/
/g, ''), '[not] to contain', expectedValue);
});
describe('Squire RTE', function () {
var doc, editor;
beforeEach(function () {
var iframe = document.querySelector('#testFrame');
doc = iframe.contentDocument;
editor = new Squire(doc);
});
function selectAll(editor) {
var range = doc.createRange();
range.setStart(doc.body.childNodes[0], 0);
range.setEnd(doc.body.childNodes[doc.body.childNodes.length - 1], doc.body.childNodes[doc.body.childNodes.length - 1].childNodes.length);
editor.setSelection(range);
}
describe('hasFormat', function () {
var startHTML;
beforeEach( function () {
startHTML = '
one two three four five
';
editor.setHTML(startHTML);
});
it('returns false when range not touching format', function () {
var range = doc.createRange();
range.setStart(doc.body.childNodes.item(0), 0);
range.setEnd(doc.body.childNodes.item(0), 1);
editor.setSelection(range);
expect(editor.hasFormat('b'), 'to be false');
});
it('returns false when range inside other format', function () {
var range = doc.createRange();
range.setStart(doc.querySelector('i').childNodes[0], 1);
range.setEnd(doc.querySelector('i').childNodes[0], 2);
editor.setSelection(range);
expect(editor.hasFormat('b'), 'to be false');
});
it('returns false when range covers anything outside format', function () {
var range = doc.createRange();
range.setStart(doc.querySelector('b').previousSibling, 2);
range.setEnd(doc.querySelector('b').childNodes[0], 8);
editor.setSelection(range);
expect(editor.hasFormat('b'), 'to be false');
});
it('returns true when range inside format', function () {
var range = doc.createRange();
range.setStart(doc.querySelector('b').childNodes[0], 2);
range.setEnd(doc.querySelector('b').childNodes[0], 8);
editor.setSelection(range);
expect(editor.hasFormat('b'), 'to be true');
});
it('returns true when range covers start of format', function () {
var range = doc.createRange();
range.setStartBefore(doc.querySelector('b'));
range.setEnd(doc.querySelector('b').childNodes[0], 8);
editor.setSelection(range);
expect(editor.hasFormat('b'), 'to be true');
});
it('returns true when range covers start of format, even in weird cases', function () {
var range = doc.createRange();
var prev = doc.querySelector('b').previousSibling;
range.setStart(prev, prev.length);
range.setEnd(doc.querySelector('b').childNodes[0], 8);
editor.setSelection(range);
expect(editor.hasFormat('b'), 'to be true');
});
it('returns true when range covers end of format', function () {
var range = doc.createRange();
range.setStart(doc.querySelector('b').childNodes[0], 2);
range.setEndAfter(doc.querySelector('b'));
editor.setSelection(range);
expect(editor.hasFormat('b'), 'to be true');
});
it('returns true when range covers end of format, even in weird cases', function () {
var range = doc.createRange();
range.setStart(doc.querySelector('b').childNodes[0], 2);
var next = doc.querySelector('b').nextSibling;
range.setEnd(next, 0);
editor.setSelection(range);
expect(editor.hasFormat('b'), 'to be true');
});
it('returns true when range covers all of format', function () {
var range = doc.createRange();
range.setStartBefore(doc.querySelector('b'));
range.setEndAfter(doc.querySelector('b'));
editor.setSelection(range);
expect(editor.hasFormat('b'), 'to be true');
});
});
describe('removeAllFormatting', function () {
// Trivial cases
it('removes inline styles', function () {
var startHTML = 'one two three four five
';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
selectAll(editor);
editor.removeAllFormatting();
expect(editor, 'to contain HTML', 'one two three four five
');
});
it('removes block styles', function () {
var startHTML = '';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
selectAll(editor);
editor.removeAllFormatting();
var expectedHTML = 'one
two
three
four
five
';
expect(editor, 'to contain HTML', expectedHTML);
});
// Potential bugs
it('removes styles that begin inside the range', function () {
var startHTML = 'one two three four five
';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
var range = doc.createRange();
range.setStart(doc.body.childNodes.item(0), 0);
range.setEnd(doc.getElementsByTagName('i').item(0).childNodes.item(0), 4);
editor.removeAllFormatting(range);
expect(editor, 'to contain HTML', 'one two three four five
');
});
it('removes styles that end inside the range', function () {
var startHTML = 'one two three four five
';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
var range = doc.createRange();
range.setStart(doc.getElementsByTagName('i').item(0).childNodes.item(0), 13);
range.setEnd(doc.body.childNodes.item(0), doc.body.childNodes.item(0).childNodes.length);
editor.removeAllFormatting(range);
expect(editor, 'to contain HTML', 'one two three four five
');
});
it('removes styles enclosed by the range', function () {
var startHTML = 'one two three four five
';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
var range = doc.createRange();
range.setStart(doc.body.childNodes.item(0), 0);
range.setEnd(doc.body.childNodes.item(0), doc.body.childNodes.item(0).childNodes.length);
editor.removeAllFormatting(range);
expect(editor, 'to contain HTML', 'one two three four five
');
});
it('removes styles enclosing the range', function () {
var startHTML = 'one two three four five
';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
var range = doc.createRange();
range.setStart(doc.getElementsByTagName('i').item(0).childNodes.item(0), 4);
range.setEnd(doc.getElementsByTagName('i').item(0).childNodes.item(0), 18);
editor.removeAllFormatting(range);
expect(editor, 'to contain HTML', 'one two three four five
');
});
it('removes nested styles and closes tags correctly', function () {
var startHTML = '';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
var range = doc.createRange();
range.setStart(doc.getElementsByTagName('td').item(1), 0);
range.setEnd(doc.getElementsByTagName('td').item(2), doc.getElementsByTagName('td').item(2).childNodes.length);
editor.removeAllFormatting(range);
expect(editor, 'to contain HTML', '' +
'two
' +
'three
' +
'');
});
});
describe('makePreformatted', function () {
it('adds a PRE element around text on same line', function () {
var startHTML = 'one two three four five
';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
editor.moveCursorToStart();
editor.makePreformatted();
expect(editor, 'to contain HTML', 'one two three four five
');
});
it('adds an empty PRE element', function () {
var startHTML = 'one two three four five
';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
editor.moveCursorToStart();
editor.makePreformatted();
expect(editor, 'to contain HTML', '\n
one two three four five
');
});
it('wraps PRE tag around plain-text-ified contents of blocks', function () {
var startHTML = 'one two
three four
five
';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
selectAll(editor);
editor.makePreformatted();
expect(editor, 'to contain HTML', 'one two\nthree four\nfive
');
});
it('expands existing PRE tags to encompass selection', function () {
var startHTML = 'abc
one two three four five
';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
selectAll(editor);
editor.makePreformatted();
expect(editor, 'to contain HTML', 'abc\n\none two three four five\n
');
});
});
describe('removePreformatted', function () {
it('replaces selected PRE tags with their HTML-ified content', function () {
var startHTML = 'abc\n\none two three four five\n
';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
selectAll(editor);
editor.removePreformatted();
expect(editor, 'to contain HTML', 'abc
one two three four five
');
});
it('cuts the beginning off PRE tags', function () {
var startHTML = 'abc\n\none two three four five\n
';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
var range = doc.createRange();
range.setStart(doc.querySelector('pre').childNodes[0], 0);
range.setEnd(doc.querySelector('pre').childNodes[0], 18);
editor.setSelection(range);
editor.removePreformatted();
expect(editor, 'to contain HTML', 'abc
one two three
four five\n
');
});
it('cuts the end off PRE tags', function () {
var startHTML = 'abc\n\none two three four five\n
';
editor.setHTML(startHTML);
expect(editor, 'to contain HTML', startHTML);
var range = doc.createRange();
range.setStart(doc.querySelector('pre').childNodes[0], 18);
range.setEnd(doc.querySelector('pre').childNodes[0], 29);
editor.setSelection(range);
editor.removePreformatted();
expect(editor, 'to contain HTML', 'abc\n\none two three
four five
');
});
describe('with collapsed selection', function () {
beforeEach(function () {
var startHTML = 'abc\n\none two three four five\nxyz
';
editor.setHTML(startHTML);
});
it('expands selection to the whole line', function () {
var range = doc.createRange();
range.setStart(doc.querySelector('pre').childNodes[0], 24);
range.setEnd(doc.querySelector('pre').childNodes[0], 24);
editor.setSelection(range);
editor.removePreformatted();
expect(editor, 'to contain HTML', 'abc\n
one two three four five
xyz
');
});
it('... even when on first line of tag', function () {
var range = doc.createRange();
range.setStart(doc.querySelector('pre').childNodes[0], 2);
range.setEnd(doc.querySelector('pre').childNodes[0], 2);
editor.setSelection(range);
editor.removePreformatted();
expect(editor, 'to contain HTML', 'abc
\none two three four five\nxyz
');
});
it('... or on last line of tag', function () {
var range = doc.createRange();
range.setStart(doc.querySelector('pre').childNodes[0], 31);
range.setEnd(doc.querySelector('pre').childNodes[0], 31);
editor.setSelection(range);
editor.removePreformatted();
expect(editor, 'to contain HTML', 'abc\n\none two three four five
xyz
');
});
});
});
afterEach(function () {
editor = null;
var iframe = document.querySelector('#testFrame');
iframe.src = 'blank.html';
});
});
})();