/*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 = '
one
' + '
  1. three
fourfive
'; 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 = '
one
twothree
fourfive
'; 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', '
one
' + '
two
' + '
three
' + '
fourfive
'); }); }); 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'; }); }); })();